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中的逻辑了.
?
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>
 
intcode_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);
    return0;
}
 
intu2g(char*inbuf, size_t inlen, char*outbuf, size_t outlen) {
    returncode_convert("utf-8","gb2312", inbuf, inlen, outbuf, outlen);
}
 
intg2u(char*inbuf, size_t inlen, char*outbuf,size_t outlen) {
    returncode_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];
    intansiLen = [ansiData length];
    intutf8Len = ansiLen * 2; //其实*1.5基本就够了
    char*utf8String = (char*)malloc(utf8Len);
    memset(utf8String, 0, utf8Len); //虽然code_convert中也memset了, 但还是自己分配后就set一次比较好
    intresult = code_convert("gb2312","utf-8", ansiString, ansiLen, utf8String, utf8Len);
    if(result == -1) {
        free(utf8String);
        returnnil;
    }
    NSString*retString = [NSStringstringWithUTF8String:utf8String];
    free(utf8String);
    returnretString;
}


代码并未实际跑过, 不过逻辑上应该没有问题 (其实转换部分是抄的)
例子工程嘛, 就算了吧.

其实此文是帮某同学解决问题的, 以上