RichieHindle正確地解釋了大多數API的一種* W(Unicode)和* A(ANSI)變體。但在此之後,他有點不對。
重要的是要知道* A變體(如MessageBoxA
)只是* W版本的包裝(如MessageBoxW
)。他們將輸入的字符串轉換爲Unicode;他們把輸出的字符串轉換回來。
在Windows SDK中,對於所有此類A/W對,存在#ifdef UNICODE
塊,因此MessageBox()
是擴展爲MessageBoxA()
或MessageBoxW()
的宏。由於所有宏都使用相同的條件,因此許多程序都使用100%* A函數或100%* W函數。那麼「非Unicode」應用程序就是而非定義的UNICODE
,因此只能使用* A變體。
但是,沒有理由不能混合搭配* A和* W功能。混合* A和* W函數的程序是否被認爲是「Unicode」,「非Unicode」還是別的?其實,答案也很複雜。當涉及到Clock,Language和Region設置時,應用程序在進行* W調用時被認爲是Unicode應用程序,在進行* A調用時被認爲是非Unicode應用程序 - 該設置控制* A包裝程序轉換爲* W電話。因此,回到RichieHindle的例子中,如果你調用一個值爲(char)0xE4
的*函數,包裝將轉發到* W功能可以使用L'ä'
或L'ה'
,具體取決於此設置。如果您直接用值(WCHAR)0x00E4
調用* W函數,則不會發生翻譯。
請記住,Unicode並不意味着UTF16,但它在Windows上。他們應該在15年前使用UTF8,而這個問題不存在。 – 2010-10-07 09:20:18
@Matt喬伊納:實際上,這個問題依然存在。請記住,我們在這裏正在討論_non-Unicode_程序。他們根本不關心_Unicode_程序是否使用UTF8或UTF16。 – MSalters 2010-10-08 14:35:11