【问题标题】:Wide character Windows宽字符窗口
【发布时间】:2011-12-04 13:39:51
【问题描述】:

Windows 将wchar_t 符号定义为 16 位长。但是,使用的UTF-16 编码告诉我们,某些符号实际上可能被编码为 4 字节(32 位)。

这是否意味着如果我正在为Windows 开发应用程序,以下语句:

wchar_t symbol = ... // Whatever

可能只代表实际符号的一部分?


如果我在*nix 下做同样的事情会发生什么,wchar_t 是 32 位长?

【问题讨论】:

    标签: c++ windows unicode utf-16


    【解决方案1】:

    是的,这意味着symbol 可能在 Windows 上持有代理对的一部分。 *nixes wchar_t 是 32 位长,将保存整个 Unicode 字符集。请注意,Unicode 代码点并不代表一个字符,因为某些字符可能由多个 Unicode 代码点编码,因此对字符进行计数根本没有意义。特别是这意味着在 Unicode 库之外的任何地方使用除 UTF-8 编码的窄字符字符串之外的任何东西都没有任何意义,即使在 Windows 上也是如此。

    阅读this old thread了解详情。

    【讨论】:

    • 您将 code point 误认为 code unit。每个字符仅与一个代码点相关联,并且可以由多个代码单元表示。
    • @ExpExc:不,我没有。一个字符可以由多个codepoint 表示,当然也可以由多个codeunit 表示。例如。 U+0061 U+U0306 是两个代码点,代表单个字符“á”。在 CJK 脚本中,这一点更加明显。
    • 同样在 Windows 上,您不应在与操作系统交互时使用 UTF-8 编码的字符串,因为操作系统本身并不解释 UTF-8 字符串。与 Windows API 交互时,应使用 UTF-16 字符串。如果您坚持使用 UTF-8,则需要在将字符串传递给 Windows API 之前调用 MultiByteToWideChar(指定 CP_UTF8)将 UTF-8 转换为 UTF-16。将应用程序简单地编码为 UTF-16 应用程序比处理 UTF-8->UTF-16 转换要容易得多。 Windows 中的 8 位字符不是 UTF-8 - 它们位于 ANSI 代码页或 OEM coe 页中。
    • ...并且由于一个古老且根深蒂固的 Windows 错误(多字节被解释为双字节),您不能将 CP_UTF8 设置为 ANSI 代码页。
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2017-07-26
    相关资源
    最近更新 更多