30

我对 Visual Studio 中的“字符集”选项有疑问。字符集选项包括:

  • 没有设置
  • 使用 Unicode 字符集
  • 使用多字节字符集

我想知道字符集中三个选项有什么区别?

另外如果我选择其中的一些,会影响对英语以外的语言(如RTL语言)的支持吗?

4

2 回答 2

32

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

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

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

于 2012-02-19T15:04:37.373 回答
14

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

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

Difference between MBCS and UTF-8 on Windows goes into these issues in a lot more detail.

于 2013-05-12T01:11:01.417 回答