nsstring 字符转换

本文介绍如何在iPhone开发环境中使用libiconv库将ANSI字符串(如gb2312编码)转换为UTF-8编码,以便于处理NSString不支持的字符集。文章提供了具体的步骤和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>
 
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;
}


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

其实此文是帮某同学解决问题的, 以上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值