显式使用 Unicode/ANSI Windows API 和让它们由别名处理之间的区别?

Posted

技术标签:

【中文标题】显式使用 Unicode/ANSI Windows API 和让它们由别名处理之间的区别?【英文标题】:Difference between explicitly using Unicode/ANSI Windows APIs and letting them be handled by aliases? 【发布时间】:2016-04-04 06:27:54 【问题描述】:

我明确地将我在项目中使用的每个 Win32 API 定义为 W(宽)或 A(ANSI),并让它由解决方案/项目配置决定,这有什么区别?除了能够动态更改它之外,就是这样。

假设出于某种原因我目前只需要 Unicode,让它们自动扩展为正确的或明确定义它们会更好吗? 如果我只为 ANSI 或 Unicode 开发而不是同时支持两者,它会在发布时破坏某些系统吗?

【问题讨论】:

如果 Microsoft 出于某种原因决定使用 UTF32 而不是 UTF16 并弃用宽字符函数,如果您一直在使用别名和 T-family 宏,那么您只需要要做的是重新编译,它应该(希望)工作得很好。如果您直接使用这些功能,您还有很多工作要做。这是一个极不可能的情况,但目前我能想到的唯一一个。 使用 Unicode 类型和函数而不是宏的优点是您的代码更清晰。您不会支持 Windows 98,所以为什么要编写代码来支持它。如果没有 Unicode 支持,您将永远无法编译。保持生活简单,避免不必要的间接。 @DavidHeffernan:通用文本映射实际上不仅仅是过去的陈旧遗留物。它们用作可以从外部控制的开关。虽然不太可能,但 Joachim 的评论概述了一种情况,通用文本映射可能是前进的正确方式。 @IInspectable 在我看来,它们是过时的遗留物。 有必要指出越来越多的函数不再具有 *A/*W 变体。只有一个版本,它需要 WCHAR。 【参考方案1】:

基于“ANSI”字符集的最后一个 Windows 版本(Windows 9x)在很久以前就已停止使用。所有较新的版本(基于 NT),甚至是嵌入式版本,都使用 UTF-16 来提供完整的 Unicode 支持。对于那些,所有的 ANSI 函数都是作为包装器实现的,这会导致开销(转换需要时间和空间)和数据丢失(ANSI 只是 Unicode 的一个子集)。

我只会使用宽版本。特别是,在导出接口时,我会避免使用基于 TCHAR 的字符串,因为这需要我提供两种不同的实现,而且对于现代代码而言,这不是必需的。

【讨论】:

【参考方案2】:

您应该更喜欢 W 变体的主要原因是,当您处理字符串时,A 调用是不可靠的——它们总是暗示隐含的代码页,这是可变的。所以程序行为取决于系统设置,这从来都不好。他们未来重新定义 TCHAR 的可能性非常接近于零——这种变化没有技术优势,而且会破坏很多东西,所以担心这个是没有意义的。

【讨论】:

以上是关于显式使用 Unicode/ANSI Windows API 和让它们由别名处理之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

UNICODE ANSI转换

unicode,ansi,utf-8,unicode big endian编码的区别

unicode,ansi,utf-8,unicode big endian编码的区别

unicode,ansi,utf-8,unicode big endian编码的区别

C#EXE w / Unmanaged C ++ Unicode DLL链接到非托管C ++ ANSI DLL崩溃

如何实现UTF-8 Unicode Ansi 汉字编码转换