none
VC中的Unicode编码方式究竟是UTF-16 or UCS-2? RRS feed

  • 问题

  • 各位好

     

        请问VC中的Unicode编码方式究竟是UTF-16 or UCS-2? 网络上很少有人讨论这个问题, 我希望能得到MS专家的权威回答.

        之所以产生这样的疑问, 是因为: UCS-2永远是用2个Byte来表示, 而UTF-16则有可能在某些特殊情况下使用4个Byte(即使特殊情况的例子我没有找到).

        我用sizeof(wchar_t)看到是2, 是否说明用的是UCS-2? 或者说实际上我们用的是UTF-16, 只是没有考虑使用>0xFFFF的情况?

     

    感谢各位的关注!

    2010年11月30日 6:05

答案

  • 嘿各位, 我找到了一篇文章, 里面做的实验完美的解答了我的疑问:

    http://blog.csdn.net/vagrxie/archive/2009/03/01/3947054.aspx

    博主找到了大于0xFFFF的字符并做了相应的实验

    虽然Windows内核使用的是UTF-16, 但VC中应该是使用的UCS-2. 所以VC是不支持那些大于0xFFFF的字符的.

    这样做的好处是, 我们在编程的时候可以把UNICODE当成固定长度的2个Byte, 丝毫不用去考虑4个Byte的情况啦

     

    • 已标记为答案 Andy1990zx 2010年12月2日 16:58
    2010年12月2日 16:55

全部回复

  • 在Windows系统中, 单纯说Unicode应该是指UTF-16方式, 维基百科是这么解释的.http://zh.wikipedia.org/zh/Unicode

    因为记事本里面选择Unicode保存, 实际上采用的是UTF-16

    那么VC呢? 理论上应该也是统一的表达方式才对吧?

    2010年11月30日 15:56
  • VC里面没有统一的编码方式,这个属于程序员决定的范围。

    如果你在编译的时候使用了Unicode宏,那么字符串会用宽字符数组保存,但是字符数组里面的数据的编码还是由你自己决定。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年11月30日 20:02
    版主
  • VC里面没有统一的编码方式,这个属于程序员决定的范围。

    如果你在编译的时候使用了Unicode宏,那么字符串会用宽字符数组保存,但是字符数组里面的数据的编码还是由你自己决定。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    如果我使用 L"中文" 这样的方式使用宽字符,  编译器在编译的时候一定是会把这个字符串转变成0x11, 0x22, 0x33, 0x44这样类型的数据存在内存里

    将"中文"转化成0x11这样的数据的时候, 就已经是在查表, 采用某种具体的编码方式了

    我想知道, 这样的一个过程使用的是什么编码方式? UTF-16 or UCS-2?

     

    我举的例子可能不太合适看不出区别, 因为这两种编码方式对于所有的中文都是一样的. 只有在大于0xFFFF的情况下, 才能看出区别. 我找不到这样的例子. 但是我无法排除这样的情况的存在. 下面是摘自维基:

     

    UTF-16与UCS-2的关系

    UTF-16可看成是UCS-2的父集。在没有辅助平面字符Mapping of Unicode character planes(surrogate code points)前,UTF-16与UCS-2所指的是同一的意思。但当引入辅助平面字符后,就称为UTF-16了。现在若有软件声称自己支援UCS-2编码,那其实是暗指它不能支援在UTF-16中超过2bytes的字集。对于小于0x10000的UCS码,UTF-16编码就等于UCS码。

     

    其实我并不是遇到了什么实际的困难, 是在学习的过程中产生的疑问. 假设有一个X语言, 它的一个Y字符, 对应的Unicode码大于0xFFFF, 那么使用UCS-2则无法表示. 采用UTF-16的话, 它的实际占用字节就要变成4Byte. 这种情况在Windows记事本里面已经考虑到了, 因为记事本的Unicode就是指UTF-16方式. VC是否也考虑到了? 如果以后需要导入这个X语言, 我们是否又会出现以前写过的软件不兼容事件? 现在的wstrlen等函数, 是否考虑到了这种4个Byte的情况? 很多人理解的Unicode就是2个Byte, 到以后是否有可能又升级为2或4个Byte??

     

     

    • 已编辑 Andy1990zx 2010年12月1日 2:49 字体统一
    2010年12月1日 2:47
  •     请问VC中的Unicode编码方式究竟是UTF-16 or UCS-2?

    您好,

    您可以做个测试:去获取当前的编码格式。


    Daoping Liu - MSFT
    2010年12月2日 3:08
    版主
  • Unicode本身是一种编码,在内存中的数据均为Unicode。但由于用Unicode来存储英文字符时会有很大的浪费,因此,针对存储设计了另外几种编码即UTF8、UTF16等等。

     

    http://www.cnblogs.com/yedaoq/archive/2010/09/14/1825840.html

     

    这是我以前找到的一篇文章,里边的介绍还是比较详细并且能自圆其说的。你可以参考一下。

    2010年12月2日 3:36
  • 嘿各位, 我找到了一篇文章, 里面做的实验完美的解答了我的疑问:

    http://blog.csdn.net/vagrxie/archive/2009/03/01/3947054.aspx

    博主找到了大于0xFFFF的字符并做了相应的实验

    虽然Windows内核使用的是UTF-16, 但VC中应该是使用的UCS-2. 所以VC是不支持那些大于0xFFFF的字符的.

    这样做的好处是, 我们在编程的时候可以把UNICODE当成固定长度的2个Byte, 丝毫不用去考虑4个Byte的情况啦

     

    • 已标记为答案 Andy1990zx 2010年12月2日 16:58
    2010年12月2日 16:55
  • 源代码中的字符串的编码方式由源代码的保存编码决定。

    源代码的保存编码可以在文件菜单中的高级保存选项中指定。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年12月2日 19:07
    版主