2010-11-10 98 views
4

例如,MessageBox函数具有用于文本和标题的LPCTSTR类型化参数,当分别定义_UNICODE或_MBCS时,它是指向char或指向wchar的指针。Win32 API函数需要什么编码?

MessageBox函数如何解释这些蜇伤?作为哪个编码?

只有解释,我好不容易才找到的是:

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

但它并没有说有关编码什么?只要在_MBCS的情况下,一个字符就会占用一个wchar(在Windows上是16位),而在_UNICODE中只有一个或两个char(8位)。

那么,那些微软的UTF-8和UTF-16版本忽略了UTF-8情况下必须以3或4字节编码的任何内容,以及任何必须以4字节编码的情况UTF-16?有没有一种方法可以显示Unicode的基本多语言平面以外的任何东西?

+2

正确的宏是'UNICODE',而不是'_UNICODE'。后者影响C标准库头,前者是Windows头文件。 – Philipp 2010-11-10 10:37:42

+0

我不知道。我做了一些阅读,现在我明白了它们的区别。谢谢。 – Bojan 2010-11-10 14:15:51

回答

5

通常有各功能的两种不同的实现:

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

这里, 'ANSI' 是指多当前分配给该进程的字节代码页。虽然Win32 API函数(如WideCharToMultiByte)可作为正确的转换计数,并且GetACP函数会告诉您正在使用的代码页,但这取决于用户的首选项和区域设置。 MSDN explains the ANSI code page and how it interacts with Unicode.

'Unicode'通常表示UCS-2;也就是说,对0xFFFF以上的字符的支持不一致。我还没有尝试过,但最近版本(> Windows 2000)中的UI函数(如MessageBox)应该支持BMP以外的字符。

+0

谢谢你的回答。简短而正是我想知道的。 – Bojan 2010-11-10 10:14:23

+4

Win2k和更高版本中的所有Unicode API函数确实需要UTF-16,而不是UCS-2。 – 2010-11-11 02:15:02

3

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