zoukankan      html  css  js  c++  java
  • 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等情况可自行查阅资料,我感觉,那些都不是很重要需要的时候查阅就可以,理解概念最关键。

    write by fgd << "如有转载请注明出处cnblogs.com/wendao"

  • 相关阅读:
    [Winform]Media Player com组件应用中遇到的问题
    [Winform]Media Player播放控制面板控制,单击事件截获
    [Winform]Media Player组件全屏播放的设置
    [EF]数据上下文该如何实例化?
    [Winform]在关闭程序后,托盘不会消失的问题
    咏南中间件跨平台解决方案
    硬件中间件
    BASE64使用场景
    DELPHI7 ADO二层升三层新增LINUX服务器方案
    NGINX心跳检测
  • 原文地址:https://www.cnblogs.com/wendao/p/2612597.html
Copyright © 2011-2022 走看看