大多数WinAPI调用都有Unicode
和ANSI
函数调用
考试:
function MessageBoxA(hWnd: HWND; lpText, lpCaption: LPCSTR; uType: UINT): Integer; stdcall;external user32; function MessageBoxW(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall; external user32;
什么时候应该使用ANSI函数而不是调用Unicode函数?
最简单的规则是这样的。 仅在没有Unicode变体的系统上使用ANSI变体。 那是Windows 95,98和ME,它们是实现Win32并且不支持Unicode的Windows版本。
这些日子,你将不可能瞄准这样的版本,所以你应该总是使用Unicode变体。
就像发布的评论/答案(罕见)例外一样…
在预期和支持UTF-8的情况下,可以选择使用ANSI调用。 例如,控制台中的WriteConsoleA'ing UTF-8字符串设置为使用TT字体并在chcp 65001下运行。
另一个古怪的例外是主要以ANSI实现的函数,其中Unicode“W”变体简单地转换为活动代码页中的窄字符串并调用“A”对应字符。 对于这样的功能,当有一个窄的字符串可用时,直接调用“A”变量可以节省冗余的双重转换。 例如OutputDebugString,直到Windows 10才进入这个类别(我刚刚注意到了https://msdn.microsoft.com/en-us/library/windows/desktop/aa363362.aspx ,它提到了WaitForDebugEventEx自Windows 10以来可用 – 为OutputDebugStringW启用真正的Unicode输出)。
然后有API,即使处理字符串,本地ANSI。 例如,GetProcAddress只存在于采用LPCSTR参数的ANSI变体中,因为导出表中的名称是窄字符串。
也就是说,大部分与字符串相关的API都是原生的Unicode,鼓励使用“W”变体。 并非所有较新的API甚至都具有“A”变体(例如CommandLineToArgvW )。 从马的嘴里https://msdn.microsoft.com/en-us/library/windows/desktop/ff381407.aspx :
Windows本身支持用于UI元素,文件名等的Unicode字符串。 Unicode是首选的字符编码,因为它支持所有的字符集和语言。 Windows使用UTF-16编码表示Unicode字符,其中每个字符都被编码为16位值。 UTF-16字符被称为宽字符,以区别于8位ANSI字符。
当Microsoft向Windows引入Unicode支持时,通过提供两组平行的API(一组用于ANSI字符串而另一组用于Unicode字符串)缓解了转换。
[…]在内部,ANSI版本将字符串转换为Unicode。 Windows头文件还定义了一个宏,在预定义符号UNICODE被定义时解析为Unicode版本,否则定义为ANSI版本。
[…] Windows中大多数较新的API只有一个Unicode版本,没有相应的ANSI版本。
[注意] 这个帖子被编辑添加最后两段。