【问题标题】:What are the disadvantages to not using Unicode in Windows?在 Windows 中不使用 Unicode 有什么缺点?
【发布时间】:2012-12-17 10:08:54
【问题描述】:

在 Windows 上不使用 Unicode 有什么缺点?

对于 Unicode,我的意思是 WCHAR 和广泛的 API 函数。 (CreateWindowW、MessageBoxW 等)

不使用它会遇到什么问题?

【问题讨论】:

  • Windows 所称的“Unicode”更准确地称为“UTF-16”,是 Unicode 的几种表示形式之一。
  • 准确来说也是little endian utf-16
  • utf8everywhere.org 深入讨论了在 Windows 上为 C++ 程序使用 Unicode 的正确与错误。

标签: c++ c windows winapi unicode


【解决方案1】:

在处理系统 API1 时,您的代码将无法正确处理当前所选代码页之外的字符。

典型问题包括不支持的字符被转换为问号、无法处理包含特殊字符的文本,尤其是名称/路径中包含“奇怪字符”的文件。

此外,一些较新的 API 仅存在于“宽”版本中。

最后,每个涉及文本的 API 调用都会稍微慢一些,因为“A”版本的 API 通常只是“W”API 的薄包装器,可以即时将参数转换为 UTF-16 - 所以,对于“普通”W 调用,您有一些开销。


  1. 没有什么能阻止您在应用程序中使用窄字符 Unicode 编码 (=>UTF-8),但 Windows "A" API don't speak UTF-8,因此您必须转换为 UTF-16 和无论如何调用W 版本。

【讨论】:

    【解决方案2】:

    我相信最初问题的要点是“我应该用“#define _UNICODE”编译我所有的 Windows 应用程序吗?如果我不这样做有什么不好?

    我最初的回答是“是的,你应该这样做。我们已经移动了 8 位 ASCII,'_UNICODE' 是任何现代 Windows 代码的合理默认值。”

    对于 Windows,我仍然认为这是相当不错的建议。但是我已经删除了我原来的回复。因为直到我重新阅读自己的链接后我才意识到“UTF-16 是一种相当可悲的事态”(正如 Matteo Italia 雄辩地指​​出的那样)。

    例如:

    http://utf8everywhere.org/

    Microsoft ... 错误地将“Unicode”和“widechar”用作 “UCS-2”和“UTF-16”的同义词。此外,由于 UTF-8 不能 设置为窄字符串 WinAPI 的编码,必须编译她 使用 _UNICODE 而不是 _MBCS 的代码。 Windows C++ 程序员是 教育必须使用“widechars”来完成 Unicode。后果 这种混乱,他们现在是最困惑的人之一 正确处理文本。

    我衷心推荐这三个链接:

    恕我直言...

    【讨论】:

    • 虽然它们的编码问题都是真实的,但我认为将其描述为“错误地”是不公平的,因为当时 unicode 实际上是所有 16 位简单字符。试图做正确的事情,被不断变化的标准所取代的痛苦......
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2020-11-18
    相关资源
    最近更新 更多