WinAPI Unicode和ANSI函数

问题描述 投票:3回答:2

大多数WinAPI调用具有UnicodeANSI函数调用

致词:

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函数?

windows function winapi unicode ansi
2个回答
4
投票

最简单的规则是:仅在不具有Unicode变体的系统上使用ANSI变体。那就是Windows 95、98和ME,它们是不支持Unicode的Windows版本。

这些天,您极不可能将此类版本作为目标,因此很可能您应该始终仅使用Unicode变体。


8
投票

与发布的评论/答案一样(罕见)例外...

如果期望并支持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版本。

[[NOTE]

该帖子经过编辑以添加最后两段。
© www.soinside.com 2019 - 2024. All rights reserved.