关于Visual Studio中的"字符集"选项

Lio*_*ing 27 visual-studio character-set

我对visual studio中的"字符集"选项有疑问.

字符集
- 未设置
- 使用Unicode字符集
- 使用多字节字符集

我想知道"字符集"中三个选项之间的区别.
而且,如果我选择其中的某些内容,则会影响对英语以外语言的支持.(比如RTL语言).

Han*_*ant 28

它是一种兼容性设置,适用于为未启用Unicode的旧版Windows编写的旧代码.Windows 9x系列中的版本,Windows ME是最后一个被广泛忽略的版本.选择"未设置"或"使用多字节字符集"时,将字符串作为参数的所有Windows API函数都重新定义为一个小的兼容性帮助函数,该函数将char*字符串转换为wchar_t*字符串,即API的本机字符串类型.

此类代码严格依赖于默认的系统代码页设置.代码页将8位字符映射到Unicode,选择字体字形.当运行代码的机器具有正确的代码页时,您的程序将只生成正确的文本.如果代码页不匹配,则值> = 128的字符将被呈现错误.

始终为现代代码选择"使用Unicode字符集".特别是当您想要支持从右到左布局的语言并且您没有在开发机器上选择阿拉伯语或希伯来语代码页时.使用std::wstringwchar_t[]在您的代码中.获取实际的RTL布局需要打开调用中的WS_EX_RTLREADING样式标志CreateWindowEx().


Chr*_*ris 12

汉斯已经回答了这个问题,但我发现这些设置都有好奇的名字.(究竟什么没有设置,为什么其他两个选项听起来如此相似?)关于:

  • 这里的"Unicode"特别是微软代表UCS-2编码.这是Hans所描述的推荐和非代码页依赖.有一个名为_UNICODE的相应C++ #define标志.
  • "多字节字符集"(又名MBCS)这里是用于描述其以前的国际文本编码方案的官方微软短语.正如汉斯所描述的,有不同的MBCS代码页描述不同的语言.编码是"多字节"的,因为一些或所有字符可以由多个字节表示.(有些代码页使用类似于UTF-8的可变长度编码.)您的典型代码页仍将所有ASCII字符表示为每个字节一个字节.有一个名为_MBCS的相应C++ #define标志
  • "未设置"显然是指编译with_UNICODE,_MBCS是#defined.在这种情况下,Windows使用每个字符编码严格的一个字节.(在这种情况下,再次提供了几个不同的代码页.)

Windows上的MBCS和UTF-8之间的区别更详细地涉及这些问题.