wchar_t引发的思考
思考是由wchar_t引发的,干嘛要用wchar_t?我用char[]可以顺利的输出汉字啊!
char是一个字节,wchar_t是2个字节或者4个字节的。
1.unicode字符集
一开始概念很混乱,发了几个帖子,和别人讨论了几天,自己理顺了下概念。我简单用我的话概括一下:
unicode字符集,什么是字符集,字符集就是一个映射表计算机通过它找到对应的字符;unicode的把全球所有文字都做了映射。
utf-8、utf-16、utf-32都是编码方式,各自实现各自的方便。
utf-8来说利于传输因为它是变长的,有一个字节的(ascii在utf-8中都只占一个字节并且是一致的),俩的,三个的。
有一个传输出错不会影响其他的。如果是固定长度的多字节编码,少一个字节后面的往前补上,所有的字符编码都变了,都成乱码了。
另一个utf-8的好处是字符编码的每个字节都不会是0000h,这样strlen得到的是正确大小,而utf-16和utf-32,如果用char字符串的话,则会有0000h(标志结束位)在字符串的非真正结束的地方存在(如果用wchar_t专用的的方法处理就会避免这些问题)。
utf-16和unicode的编码是一样的。
字符集和实际编码的联系:因为每个字符和其字符集中的16位二进制码值是一一对应的,实际编码只有转换成相应的字符集对应的16位的unicode码才能知道它代表哪个字符。关于utf-8和unicode的转换可以自己搜一下,这里就不说了,我也没自仔细看。
2.wchar_t
wchar_t正好可以放一个unicode字符,正好就可以轻易的让它与要显示的字符对应,也可以用他转成想要的其他形式的编码。而如果用char的话,它只有8位,只能一次处理8位的数据,如果将char原封不动的输出,那用它可以。(用char字符串去做转换,那可就麻烦了,还要不断的和前后的char做判断)。java中char都是2个字节的。
一般在程序中用unicode(utf-16),输出到文本中都是utf-8,所以输出前要转码。
char *c="我";c字符串的值,一般是utf-8,具体要看你文本编辑器的编码格式。
而wchar_t wc=L"我";这个是utf-16码(vs中)。linux中由于wchar_t是4个字节,这个编码就成了utf-32了。高位基本没用,16位和unicode编码一致(linux下没测试,知道linux下wchar_t是32位,还有utf-32和utf-16低位是一致的)。
将utf-8编码的unicode字符集放入wchar_t中是不明智的,因为,这样wchar_t中可能有两个字符的编码,也可能有一个,也可能不到一个,也可能2个半个。
3.其他细节
其他关于UNICODE的字符编具体细节,如utf-8的bom头,字符序Big Endian、Little Endian等情况可自行查阅资料,我感觉,那些都不是很重要需要的时候查阅就可以,理解概念最关键。