BSTR是否采用UTF-16编码?

4

我正在学习Unicode,最困难的部分是编码。BSTRs(基本字符串)可以包含U+10000或更高的代码点吗?如果不行,那么BSTRs的编码是什么?


如果您正在尝试理解字符集、编码等相关内容,我相信这个编码和字符集资源会非常有帮助。 - Aravind Yarram
2个回答

2
Microsoft-speak,Unicode通常等同于UTF-16(如果我没记错的话,是小端序)。在BSTR的情况下,答案似乎是“取决于”:

  • 在Microsoft Windows上,由Unicode字符(宽字符或双字节字符)组成的字符串。
  • 在Apple Power Macintosh上,由单字节字符串组成。
  • 可能包含多个嵌入的空字符。

因此,在Windows上,是的,它可以包含基本多语言平面之外的字符,但这些字符需要使用两个“宽”字符来存储。


2
我反汇编了系统函数SysStringByteLen和SysStringLen。两者都返回字节长度前缀,但SysStringByteLen首先将其除以2。这是否意味着系统正在使用UCS-2编码? - Mike
1
@Mike:我认为SysStringLen的文档有误,它返回字符串中16位代码单元的数量。在UTF-16中,代码点U+10000及以上的字符使用两个16位代码单元。 - dalle
@dalle:这很有道理。你知道有一个返回字节数的函数吗? - Mike
@Mike - API通常在长度和变宽编码方面不会尝试变得聪明。字符数并不一定等于Unicode代码点的数量。(C#和Java中也会出现相同的行为。)在我的看法中,UTF-16对UCS-2支持在字体渲染和转码等领域变得更加相关。计算代码点不一定非常有用-代码点序列可以组合在一起呈现单个字形。http://unicode.org/reports/tr29/ 更有用的是知道艺术品需要多少存储空间。 - McDowell
@McDowell: 目前我关心的唯一事情是用多少字节来表示字符串。我不需要解释代码点。实际上,我只需要知道字符串的起始地址和它的字节长度而不需要知道编码方式。 - Mike
@McDowell 和 @dalle: 抱歉我漏掉了你们的一个观点。BSTR 每个代码点使用两个字节。一个字符可以使用多个代码点。非常感谢你们……这回答了我的问题。 - Mike

1

Windows上的BSTR最初包含UCS-2,但原则上可以使用代理对包含整个unicode集。 UTF-16支持实际上取决于接收字符串的API - BSTR无法决定其处理方式。大多数API现在都支持UTF-16。(Michael Kaplan会解决细节问题。)

Windows头文件仍然包含另一个BSTR定义,基本上是这样的

#if defined(_WIN32) && !defined(OLE2ANSI)
   typedef wchar_t OLECHAR;
#else
   typedef char OLECHAR;
#endif
typedef OLECHAR * BSTR;

然而,除非您非常希望与此相关兼容,否则没有真正的理由考虑 char。(如果我没记错,它对于早期的 MFC 构建是活动的 - 或者可以激活 - 并且甚至可能在 Mac 上的 Office 中使用过。)


Windows上的BSTR使用UTF-16,而不是UCS-2。 - Remy Lebeau
最初包含 - 但我已更新以避免误解。从某种意义上说,BSTR本身既不是UCS-2也不是UTF-16,它只是一个wchar_t数组,例如SysStringLen将代理对计为两个字符。 - peterchen
以前你可以通过 #definine OLE2ANSI 来切换 OLECHAR(因此在窄字符(CP_ACP)和宽字符(UTF-16)之间使用它的函数签名),类似于如何通过定义 UNICODE 或定义 _UNICODE 来切换其他 Win32 函数。这在 ATL 7.0 中被删除,现在它总是宽字符。 - puetzk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接