我正在学习Unicode,最困难的部分是编码。BSTRs(基本字符串)可以包含U+10000或更高的代码点吗?如果不行,那么BSTRs的编码是什么?
- 在Microsoft Windows上,由Unicode字符(宽字符或双字节字符)组成的字符串。
- 在Apple Power Macintosh上,由单字节字符串组成。
- 可能包含多个嵌入的空字符。
因此,在Windows上,是的,它可以包含基本多语言平面之外的字符,但这些字符需要使用两个“宽”字符来存储。
SysStringLen
的文档有误,它返回字符串中16位代码单元的数量。在UTF-16中,代码点U+10000及以上的字符使用两个16位代码单元。 - dalleWindows上的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 中使用过。)
wchar_t
数组,例如SysStringLen
将代理对计为两个字符。 - peterchen#definine OLE2ANSI
来切换 OLECHAR(因此在窄字符(CP_ACP)和宽字符(UTF-16)之间使用它的函数签名),类似于如何通过定义 UNICODE
或定义 _UNICODE
来切换其他 Win32 函数。这在 ATL 7.0 中被删除,现在它总是宽字符。 - puetzk