【问题标题】:how does windows wchar_t handle unicode characters outside the basic multilingual plane?windows wchar_t 如何处理基本多语言平面之外的 unicode 字符?
【发布时间】:2011-12-13 18:37:59
【问题描述】:

我在这里和其他地方查看了许多其他帖子(见下文),但我仍然没有明确回答这个问题:windows wchar_t 如何处理基本多语言平面之外的 unicode 字符?

即:

那么当您想编写类似 ???? 的代码时,Windows 会做什么? (U+2008A) Windows 上的汉字?

【问题讨论】:

  • Windows 使用 UCS2 作为编码。
  • 我也是这么想的。但是,我刚刚在我的 Windows 计算机上成功编辑了一个文件名以包含 ???? (U+1D565) 数学双敲击小 T. (见programmers.stackexchange.com/questions/102205/…)。很明显,即使 Windows 使用的是 UCS-2,它也允许我在文件名中添加 SMP 字符。那么它是如何做到的呢?
  • 根据Wikipedia,“NTFS 允许名称编码的任何 16 位值序列(文件名、流名、索引名等)。这意味着支持 UTF-16 代码点,但文件系统不检查序列是否是有效的 UTF-16(它允许任何短值序列,不限于 Unicode 标准中的那些)”。
  • @K-ballo:Windows 从 NT4 开始就没有使用 UCS-2。从 Windows2000 开始,现在一切都使用 UTF-16。
  • 奇怪。我用这个词发现越来越多的问题。请随意建议标签同义词,但 Unicode 并没有提供一个单一的术语来涵盖所有其他平面,每个平面只有四个左右丑陋和笨拙的名称,到目前为止,没有人提出关于这些单独平面的问题。我确实在名称中考虑了一些想法,到目前为止,我认为它是最好的折衷方案。大多数人都使用“不在”、“超越”、“其他”等措辞与“bmp”或“基本多语言平面”一起使用,但这些似乎并没有导致伟大的标签名称......

标签: winapi unicode wchar-t


【解决方案1】:

Windows 过去使用 UCS-2,但在 Windows 2000 中采用了 UTF-16。Windows wchar_t API 现在生成和使用 UTF-16。

并非所有第三方程序都能正确处理此问题,因此 BMP 之外的数据可能存在错误。

另外,请注意 UTF-16 作为一种可变长度编码,不符合 C 或 C++ 对与 wchar_t 一起使用的编码的要求。这会导致一些问题,例如某些采用单个 wchar_t 的标准函数,例如 wctomb,在 Windows 上无法处理超出 BMP 的字符,以及 Windows 定义了一些使用更宽类型的附加函数以便能够处理单个字符在 BMP 之外。我忘记了它是什么函数,但我遇到了一个返回 int 而不是 wchar_t 的 Windows 函数(而且它不是 EOF 可能的结果)。

【讨论】:

    【解决方案2】:

    wchar_t 在 Windows 标准库下的实现是 UTF-16-oblivious:它只知道大约 16 位代码单元。

    因此,您可以将 UTF-16 代理序列放入字符串中,并且可以选择使用更高级别的处理将其视为单个字符。字符串实现不会帮助你,也不会阻碍你;它可以让您在字符串中包含任何代码单元序列,即使是在解释为 UTF-16 时无效的代码单元。

    Windows 的许多高级功能确实支持由 UTF-16 代理组成的字符,这就是为什么您可以调用文件 ?.txt 并看到它正确呈现和正确编辑(只需一次按键,而不是二,在支持复杂文本布局(通常使用 Windows 的 Uniscribe 库)的程序(如 Explorer)中移过字符。

    但仍有一些地方可以看到 UTF-16-obliviousness,例如,您可以在与 ?.txt 相同的文件夹中创建一个名为 ?.txt 的文件,否则不区分大小写会被禁止它,或者您可以通过编程方式创建[U+DC01][U+D801].txt

    这就是学究们如何就 Windows “支持” UTF-16 字符串还是只支持 UCS-2 进行冗长且基本上毫无意义的争论。

    【讨论】:

    • +1 表示“支持”。首先定义你的命名,然后争论。 :)
    • 那些?.txt-s 在 Chrome 中对我来说都是一样的(一个“?”),这不是故意的,对吧? ;)
    猜你喜欢
    • 2012-04-03
    • 2013-10-23
    • 2018-01-22
    • 1970-01-01
    • 2011-05-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多