【问题标题】:Can BSTR's hold characters that take more than 16 bits to represent?BSTR 可以容纳超过 16 位来表示的字符吗?
【发布时间】:2010-12-27 18:08:45
【问题描述】:

我对 Windows BSTR 和 WCHAR 等感到困惑。WCHAR 是一个 16 位字符,旨在允许 Unicode 字符。那些需要超过 16 位来表示的字符呢?一些 UTF-8 字符需要更多。这是 Windows 的限制吗?

编辑:感谢所有答案。我想我了解 Unicode 方面。不过,我仍然对 Windows/WCHAR 方面感到困惑。如果 WCHAR 是 16 位字符,Windows 真的使用其中的 2 个来表示大于 16 位的代码点还是数据被截断?

【问题讨论】:

  • 是的,它确实使用两个 WCHAR 值来表示一个大的 Unicode 值。这就是 UTF-16 的工作原理。

标签: c++ windows unicode utf-8


【解决方案1】:

Unicode 标准定义了超过一百万个唯一代码点(每个代码点代表一个“抽象”字符或符号 - 例如“E”、“=”或“~”)。

该标准还定义了几种将这百万个代码点编码为常用基本数据类型的方法,例如 8 位字符或 16 字节 wchars。

使用最广泛的两种编码是 utf-8 和 utf-16。 utf-8 定义了如何将 unicode 代码点编码为 8 位字符。每个 unicode 代码点将映射到 1 到 4 个 8 位字符。

utf-16 定义了如何将 unicode 代码点编码为 16 位字(Windows 中的 WCHAR)。大多数代码点将映射到一个 16 位 WCHAR,但有些代码点需要两个 WCHAR 来表示。

我建议查看 Unicode 标准,尤其是常见问题解答 (http://unicode.org/faq/utf_bom.html)

【讨论】:

  • UCS-2 不是 UTF-16。 2 之间有很大的不同。UCS-2 只允许每个字符使用一个 WCHAR。 UTF-16 允许将字符表示为 1 个或 2 个 WCHAR。
  • 是的 - 删除了 ucs-2 引用
【解决方案2】:

自 Windows 2000 以来,Windows 一直使用 UTF-16 作为其本机表示;在此之前,它使用 UCS-2。 UTF-16 支持任何 Unicode 字符; UCS-2 仅支持 BMP。即它会做正确的事。

不过,总的来说,这并不重要。对于大多数应用程序来说,字符串是非常不透明的,只是传递给一些 I/O 机制(用于存储在文件或数据库中,或显示在屏幕上等),这些机制将做正确的事情。您只需要确保根本不会损坏琴弦。

【讨论】:

    【解决方案3】:

    BSTR 仅包含 16 位代码单元,可以包含任何 UTF-16 编码数据。至于操作系统,Windows 从 XP 开始就支持代理对。见Dr International FAQ

    【讨论】:

      【解决方案4】:

      UTF-8 不是 Windows 的 BSTR 或 WCHAR 类型中使用的编码。相反,它们使用 UTF-16,它使用 1 个或 2 个 WCHAR 定义 Unicode 集中的每个代码点。 2 个 WCHAR 提供的代码点数量与 4 个字节的 UTF-8 完全相同。

      因此在 Windows 字符集处理上没有限制。

      【讨论】:

      • 我似乎记得 Windows 曾经将 Unicode 字符串视为 UCS-2。真的吗?什么时候变的?
      • Windows 2000 引入了 UTF-16、IIRC。
      【解决方案5】:

      正如其他人所提到的,FAQ 中有很多关于 unicode 的重要信息。

      但是,对您的问题的简短回答是,单个 unicode 字符可能需要多个 16 位字符来表示它。这也是 UTF-8 的工作原理;任何超出单个字节能够表示的范围的 unicode 字符都使用两个(或更多)字节。

      【讨论】:

        【解决方案6】:

        UTF8 是 Unicode 字符(代码点)的编码。您可能想阅读有关该主题的excellent faq。不过,要回答您的问题,BSTR 始终编码为 UTF-16。如果你有 UTF-32 编码的字符串,你必须transcode them first.

        【讨论】:

          猜你喜欢
          • 2013-12-26
          • 1970-01-01
          • 1970-01-01
          • 2016-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-28
          相关资源
          最近更新 更多