Skip to content

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

@Mq-b

Description

@Mq-b

从 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions