Win32 API函数期望使用哪种编码?

5
例如,MessageBox函数具有用于文本和标题的LPCTSTR类型参数,当定义了_UNICODE或_MBCS时,它是指向char或指向wchar的指针。
MessageBox函数如何解释这些字符串?使用哪种编码?
我找到的唯一解释是这个:

http://msdn.microsoft.com/en-us/library/cwe8bzh0(VS.90).aspx

但它没有提到任何关于编码的内容?只是在_MBCS的情况下,一个字符占用一个wchar(在Windows上为16位),而在_UNICODE的情况下,一个或两个char(8位)。

那么这些是一些Microsoft版本的UTF-8和UTF-16,忽略了需要在UTF-8中编码为3或4个字节的任何内容,以及需要在UTF-16中编码为4个字节的任何内容吗?并且有没有办法在MessageBox中显示Unicode基本多语言平面之外的任何内容?


3
正确的宏是UNICODE,而不是_UNICODE。后者影响C标准库头文件,前者影响Windows头文件。 - Philipp
我之前不知道这个。但是我查了一些资料,现在我明白它们的区别了。谢谢。 - Bojan
2个回答

6

每个函数通常有两种不同的实现:

  • MessageBoxA,接受ANSI字符串
  • MessageBoxW,接受Unicode字符串

这里,“ANSI”表示分配给进程的多字节代码页。这根据用户的首选项和区域设置而变化,尽管可以依靠Win32 API函数(如WideCharToMultiByte)进行正确的转换,并且GetACP函数将告诉您正在使用的代码页。MSDN解释了ANSI代码页及其与Unicode的交互方式。

“Unicode”通常表示UCS-2;也就是说,对于超过0xFFFF的字符支持并不一致。我没有尝试过这个,但是在最新版本(> Windows 2000)中的UI函数(例如MessageBox)应该支持BMP之外的字符。


6
在Windows 2000及以后的版本中,所有Unicode API函数确实都期望使用UTF-16而不是UCS-2。 - Remy Lebeau

4

...A函数已经过时,只是对...W函数的包装。前者仅为与Windows 9x兼容而需要,但由于现在不再使用,您应该尽可能避免使用它们并仅使用...W函数。它们需要UTF-16字符串,这是唯一的本地Windows编码。所有现代Windows版本都应该非常好地支持非BMP字符(当然,如果有包含这些字符的字体)。


*A 函数与 *W 函数不同,它们期望在特定代码页中的字符字符串(最终开始允许 UTF-8 "页")。而未经修饰的函数(如 MessageBox)则映射到 AW 版本。 - Justin Time - Reinstate Monica

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