首页  > 计算机 >

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的地方写错了。



一个评论

  1. 红孩子:

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

发表评论

  本站文章若无注明,则以署名·非商业用途·保持一致授权
  桂ICP备05004302号 感谢WordPress提供本程序 本模板下载