2010-11-10 95 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字符(當然,如果字體有這些字符的話)。