wchar_t到NSString的转换
本文按署名·非商业用途·保持一致授权作者:
,发表于2009年04月26日18时52分
首先,要了解wchar_t在类unix系统下,所有的字符都是以32-bit来存储的。而NSString,则是使用16-bit来存储。前者是UTF-32,后者应该是UTF-16(我没看到相关的文档,但是从程序表现来看,是UTF-16)。
其次,很幸运的是,UTF-32在BMP范围内(这时候它的高16位是0),编码是和UTF-16一致的(当然实际存储不一样,前者多了0×0000)。所以,我们可以把wchar_t简单地做一个到unichar的类型转换,然后在通过stringWithCharacters:length:来创建NSString。代码如下:
wchar_t *wc=L”中文”;
unichar uc[2];
uc[0]=wc[0];
uc[1]=wc[1];
NSString *nss=[NSString stringWithCharacters:uc length:2];
NSLog(nss);
这段代码,在绝大部分情况下,是没问题的。因为包括CJK在内的几乎所有在用的字符,都是在BMP的范围里。但是看这段代码:
wchar_t wc[1]={0x2233597d};
unichar uc[1];
uc[0]=wc[0];
这时候如果打印uc出来,会发现它的值是0x597d。也就是说,因为unichar只能保存16个bits,所以wchar_t的数据只有低16bits被unichar使用(这里提醒一下是被使用,而不是拷贝了一份)。简单地说,就是如果wchar_t保存的是超过0xffff的串,那么unichar得到结果就是不准确的。但是这种机会不多,除非你在研究例如某些康熙字典里的汉字。
update:
罪过,最近把赋值都看成是指针赋值,上面被我del的地方写错了。

2009-04-27 19:46:39
博主您好,申请贵站的友情连接,贵站连接已经做好希望能通过!
博客名称: 红孩子
博客地址: http://www.da754.cn/