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中的邏輯了.
#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);
}
而在實際應用時, 無論從文件或者網絡讀取, 都要獲取成NSData或者char *或void *, 至少不能是NSString, 因爲NSString無法直接處理.
以獲取成NSData爲例.
+ (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;
}
下面方法也可行:
NSStringEncoding myEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString* postStr = [NSString stringWithFormat:@"isbn=%@",ISBNStr];
NSData* postData = [postStr dataUsingEncoding:myEncoding];