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