BSTR可以保存超过16位的字符来表示吗?

时间:2009-12-17 17:29:40

标签: c++ windows unicode utf-8

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

编辑:感谢您的所有答案。我想我理解Unicode方面。我仍然对Windows / WCHAR方面感到困惑。如果WCHAR是一个16位字符,那么Windows是否真的使用其中的两个表示大于16位的代码点或是否截断了数据?

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

两种使用最广泛的编码是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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

BSTR只包含16位代码单元,可以包含任何UTF-16编码数据。至于操作系统,Windows自XP以来就支持代理对。请参阅Dr International FAQ

答案 5 :(得分:0)

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

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