Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Mq-b opened this issue Nov 6, 2024 · 0 comments
Open

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

Mq-b opened this issue Nov 6, 2024 · 0 comments

Comments

@Mq-b
Copy link
Contributor

Mq-b commented Nov 6, 2024

从 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant