【问题标题】:What encoding Win32 API functions expect?Win32 API 函数需要什么编码?
【发布时间】:2010-11-10 09:48:14
【问题描述】:

例如,MessageBox 函数具有用于文本和标题的 LPCTSTR 类型参数,当分别定义 _UNICODE 或 _MBCS 时,它是指向 char 的指针或指向 wchar 的指针。

MessageBox 函数如何解释这些字符串?作为哪种编码?

我设法找到的唯一解释是:

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

但它没有说明编码?只是在 _MBCS 的情况下,一个字符占用一个 wchar(在 Windows 上为 16 位),而在 _UNICODE 的情况下,一个或两个字符(8 位)。

Microsoft 的 UTF-8 和 UTF-16 版本也是如此-16?有没有办法用 MessageBox 显示 Unicode 基本多语言平面之外的任何内容?

【问题讨论】:

  • 正确的宏是UNICODE,而不是_UNICODE。后者影响 C 标准库头文件,前者影响 Windows 头文件。
  • 我不知道。我做了一些阅读,现在我明白了其中的区别。谢谢。

标签: unicode encoding winapi


【解决方案1】:

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

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

这里,'ANSI' 表示当前分配给进程的多字节代码页。这根据用户的偏好和区域设置而有所不同,尽管可以依靠 WideCharToMultiByte 等 Win32 API 函数来进行正确的转换,并且 GetACP 函数会告诉您正在使用的代码页。 MSDN explains the ANSI code page and how it interacts with Unicode.

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

【讨论】:

  • Win2k 及更高版本中的所有 Unicode API 函数确实需要 UTF-16,而不是 UCS-2。
【解决方案2】:

...A 函数已过时,仅包装 ...W 函数。前者是与 Windows 9x 兼容所必需的,但由于不再使用它,因此您应该不惜一切代价避免使用它们并专门使用 ...W 函数。它们需要 UTF-16 字符串,这是唯一的原生 Windows 编码。所有现代 Windows 版本都应该很好地支持非 BMP 字符(当然,如果存在具有这些字符的字体)。

【讨论】:

  • *A 函数与*W 函数不同,它们需要特定代码页中的字符串(并且最终开始允许使用 UTF-8“页”)。映射到A 或W 版本的是朴素的(如MessageBox)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多