【问题标题】:"Windows uses UTF-16 as its internal encoding", what exactly does this mean?“Windows 使用 UTF-16 作为其内部编码”,这究竟是什么意思?
【发布时间】:2011-12-18 12:19:50
【问题描述】:

对不起,如果这个问题很愚蠢,这让我有点困惑,假设我在我的 Windows XP 上有一个应用程序(无论是 C、C++、.NET 还是 Java),并且这个应用程序将从远程机器获取数据,数据中包含汉字,现在如果汉字变成垃圾了,说windows跟这个问题没有关系对吗?因为Windows使用UTF-16,可以正常处理汉字。

另一方面,假设Windows使用ASCII作为其内部编码,这是否意味着其上的任何应用程序都无法正确显示汉字?

提前致谢。

【问题讨论】:

  • 正如它所说的“内部编码” - 只谈论 Windows 本身......无论您的应用做什么或不做什么完全取决于应用!

标签: windows encoding utf-8


【解决方案1】:

Windows NT 内核将UNICODE_STRING 用于许多(或者是大多数?)命名对象(例如文件)。编码为 UTF-16。

许多用户模式可调用 API 公开了几乎相同的函数对,其中一个接受 Unicode 字符串,另一个接受 ANSI 字符串。 ANSI 字符串版本最终会将名称从 ANSI 转换为 Unicode。

例如,当您调用 C 的 fopen() 函数时,它接受 8 位非 Unicode 文件名,它最终会调用 CreateFileA() (ANSI),并最终调用 NtCreateFile(),它接受 Unicode 文件名. NtCreateFile() 的参数之一,OBJECT_ATTRIBUTES 结构,包含一个指向 UNICODE_STRING 结构的指针。

另一方面,如果你调用 MSVC++ 的 _wfopen() 函数,它将通过 CreateFileW() (Unicode) 到达 NtCreateFile() 而无需转换。

【讨论】:

  • 是 UTF-16 还是 UCS-2? UTF-16 包括表示超过 0xFFFF 的字符的序列; UCS-2 是纯 16 位的。引用的网页没有说。 (它还谈到了字符串是“NULL-terminated”,但 NULL 是一个空 pointer 常量。)
  • @Keith Thompson:Rtl* 字符串函数比较字节,而不是代码点,但内核实际上并不关心编码。此外,文档试图说的是 UNICODE_STRING 不一定以 null 结尾(null 为 (WCHAR)0),并且 Length 字段从不包含任何 null 终止符(如果存在)。
  • @wj32:重点是“NULL-terminated”不正确; “空终止”是正确的。 (我已经给他们发了电子邮件;我们会看看它是否有用。)
  • @Keith Thompson:有一个叫做 UNICODE_NULL 的常量,所以他们可能指的是那个。
  • @KeithThompson:我不认为 Windows 中到处都需要和完全支持 Unicode,例如,NTFS doesn't try to make much sense of file names nor validate them:NTFS allows any sequence of 16-bit values for name encoding (file names, stream names, index names, etc.). This means UTF-16 codepoints are supported, but the file system does not check whether a sequence is valid UTF-16 (it allows any sequence of short values, not restricted to those in the Unicode standard).
【解决方案2】:

要将任何文本存储在内存中并将其显示在屏幕上,操作系统需要在后台以 some 编码处理该文本。具体是什么编码对您来说并不重要。只要 API 接受某些文本并输出正确的内容,它就可以将其作为 HTML 编码的 ASCII 处理。

“Windows 内部使用 UTF-16”表示 Windows 恰好在内部将文本存储和处理为 UTF-16。它还支持中文文本。这两件事不一定有联系。是的,内部使用 UTF-16 更容易支持中文,这可能是 Windows 工程师选择使用 UTF-16 的原因。

【讨论】:

  • 好的,谢谢。所以这一切都取决于应用程序,与操作系统无关,对吧?区域和语言选项如何(可以在 Windows 的“控制面板”中找到)?此设置会导致任何垃圾字符问题吗?
  • 取决于您的应用。有一个设置可以控制不使用 Unicode 的旧版应用程序的行为方式。如果您的应用程序能够正确处理自身,则这些设置都不会产生影响。我不能说更多,因为我真的不是 Windows 程序员。
  • 微软为什么不使用UTF-32,所以支持所有字符?例如,UTF-16 不能包含 Unicode 13.0.0 所具有的所有字符 - 对吧? (我一直在阅读这方面的内容,希望我不会提出愚蠢的问题哈哈)据我所知,支持所有字符,Windows UTF-32。或不?或者它可以使用 UTF-16 或 UTF-8 并使用像 \u4356+\u2349 来表示 32 位字符?
猜你喜欢
  • 1970-01-01
  • 2013-11-30
  • 2011-03-12
  • 2014-10-29
  • 2016-01-27
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多