nsstring 字符转换
来源:互联网 发布:城中大盗 知乎 编辑:程序博客网 时间:2024/06/06 05:20
iPhone的NSString并不支持ansi的字符串(比如咱们常用的gb2312), 因此如果要读取的话, 需要转换为UTF-8的
而iPhone上自带了libiconv库, 于是这个转换变的就比较简单了
首先在工程的Framework部分加入 /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/libiconv.dylib
当然, 中间那个iPhoneOS3.0.sdk需要换成你当前使用的SDK版本
实际转换过程也就4步.
1, 引入iconv库并添加头文件
2, 利用iconv_open设置from和to的字符串编码
3, 执行iconv进行转换
4, 利用iconv_close关闭iconv_open创建的实例.
基本上就是下面的代码片段中 code_convert中的逻辑了.
而在实际应用时, 无论从文件或者网络读取, 都要获取成NSData或者char *或void *, 至少不能是NSString, 因为NSString无法直接处理.
以获取成NSData为例.
代码并未实际跑过, 不过逻辑上应该没有问题 (其实转换部分是抄的)
例子工程嘛, 就算了吧.
其实此文是帮某同学解决问题的, 以上
而iPhone上自带了libiconv库, 于是这个转换变的就比较简单了
首先在工程的Framework部分加入 /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/libiconv.dylib
当然, 中间那个iPhoneOS3.0.sdk需要换成你当前使用的SDK版本
实际转换过程也就4步.
1, 引入iconv库并添加头文件
2, 利用iconv_open设置from和to的字符串编码
3, 执行iconv进行转换
4, 利用iconv_close关闭iconv_open创建的实例.
基本上就是下面的代码片段中 code_convert中的逻辑了.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iconv.h>
int
code_convert(
char
*from_charset,
char
*to_charset,
char
*inbuf, size_t inlen,
char
*outbuf, size_t outlen) {
iconv_t cd =
NULL
;
cd = iconv_open(to_charset, from_charset);
if
(!cd)
return
-1;
memset(outbuf, 0, outlen);
if
(iconv(cd, &inbuf, &inlen, &outbuf, &outlen) == -1)
return
-1;
iconv_close(cd);
return
0;
}
int
u2g(
char
*inbuf, size_t inlen,
char
*outbuf, size_t outlen) {
return
code_convert(
"utf-8"
,
"gb2312"
, inbuf, inlen, outbuf, outlen);
}
int
g2u(
char
*inbuf, size_t inlen,
char
*outbuf,size_t outlen) {
return
code_convert(
"gb2312"
,
"utf-8"
, inbuf, inlen, outbuf, outlen);
}
</iconv.h>
而在实际应用时, 无论从文件或者网络读取, 都要获取成NSData或者char *或void *, 至少不能是NSString, 因为NSString无法直接处理.
以获取成NSData为例.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+ (
NSString
*)getANSIString:(
NSData
*)ansiData {
char
*ansiString = [ansiData bytes];
int
ansiLen = [ansiData length];
int
utf8Len = ansiLen * 2;
//其实*1.5基本就够了
char
*utf8String = (
char
*)malloc(utf8Len);
memset(utf8String, 0, utf8Len);
//虽然code_convert中也memset了, 但还是自己分配后就set一次比较好
int
result = code_convert(
"gb2312"
,
"utf-8"
, ansiString, ansiLen, utf8String, utf8Len);
if
(result == -1) {
free(utf8String);
return
nil
;
}
NSString
*retString = [
NSString
stringWithUTF8String:utf8String];
free(utf8String);
return
retString;
}
代码并未实际跑过, 不过逻辑上应该没有问题 (其实转换部分是抄的)
例子工程嘛, 就算了吧.
其实此文是帮某同学解决问题的, 以上
- nsstring 字符转换
- NSString 转换特殊字符“&”“@”“#”等
- NSString 转换特殊字符“&”“@”“#”等
- 字符数组转换成NSString
- NSString 与UTF8 的字符转换
- 包含中文字符的NSString 转换为NSURL
- 中文字符ASCII码和NSString相互转换
- 中文字符ASCII码和NSString相互转换
- NSString 中包含中文字符时转换为NSURL
- iOS 解决NSString转换为NSURL时包含中文字符
- 中文字符ASCII码和NSString相互转换
- 中文字符ASCII码和NSString相互转换
- NSString 中包含中文字符时转换为NSURL
- NSString 中包含中文字符时转换为NSURL
- NSString 中包含中文字符时转换为NSURL
- 中文字符ASCII码和NSString相互转换
- NSString字符编码
- NSString删除某个字符
- linux系统下mysql中文乱码解决
- cglib
- java 调用open淘宝API
- 读书笔记之《Data Structures With C++》
- Eclipse RCP 项目导出后中文乱码
- nsstring 字符转换
- phoneME Feature 实现代码目录描述
- Photoshop touch教程全攻略
- Yii-kindediter-模板编辑,插入预定义变量
- 10分钟了解C#中的协变和逆变
- 高精度加法
- VS中的语法高亮插件VisualAssistX10.7
- JS全局变量
- Android应用升级构想和要点总结