parallel101 / cppguidebook

小彭老师领衔编写,现代C++的中文百科全书
https://142857.red/book/
Other
715 stars 56 forks source link

编码中的windows专题是存在错误的 #64

Open Mq-b opened 2 weeks ago

Mq-b commented 2 weeks ago

从 Windows NT 版本开始,对于所有涉及字符串的,其操作系统 API 提供了两套函数。

  • 一套是 A 系列函数,以 A 结尾,例如 CreateFileA,这些函数接收 ANSI(即 GBK)编码的字符串。
  • 另一套是 W 系列函数,以 W 结尾,例如 CreateFileW,这些函数接收 Unicode(即 UTF-16)编码的字符串。 其中 CreateFileW 才是 Windows 系统真正的 API。

而 CreateFileA 是为了兼容基于 ANSI 的老程序.

A 系列函数是根据当前系统区域设置(区域语言环境)使用的编码,也就是 Windows 操作系统的当前“代码页”或“区域编码”。这个编码并不固定为 GBK 或其他特定编码,而是和系统的区域设置相关。

也并非是所谓的兼容老程序。

另外,在 visual studio 的 sln 解决方案中,还有一个非常抽象的选项设置。在 配置熟悉 -> 常规 -> 字符集

很多人都以为这里可以设置所谓的编码,点击下拉选项你可以选择多字节字符集或者 Unicode 字符集。但是这纯属是一种误导,它既无法改变源字符集,也无法改变执行字符集,它做的事情无非是添加宏定义。

当你选择 Unicode 字符集的时候,添加链接选项 /D "UNICODE" 实则就是定义 _UNICODE 宏。

它只不过是在使用宏函数的时候,用来选择 A 或者 W 系列函数而已。

https://learn.microsoft.com/zh-cn/cpp/atl-mfc-shared/unicode-and-multibyte-character-set-mbcs-support?view=msvc-170

https://learn.microsoft.com/zh-cn/cpp/text/unicode-programming-summary?view=msvc-170