"ANSI"代码页基本上是传统的:Windows 9X时代.无论如何,所有现代软件都应该是Unicode(即UTF-16).
基本上,当最初设计Ansi代码页的东西时,UTF-8甚至没有被发明,因此对多字节编码的支持是相当偶然的(即大多数Ansi代码页是单字节的,除了一些东亚代码页这是一个或两个字节).当所有新开发都应该以UTF-16完成时,添加对"正确"多字节编码的支持可能被认为是不值得的.
原因与jamesdlin 的答案及其下面的评论中所说的完全一样:MBCS 与 Windows 中的 DBCS 相同,并且某些函数不适用于长度超过 2 个字节的字符
\n\n\n微软表示 UTF-8 语言环境可能会破坏一些功能功能,因为它们被编写为假定每个字符使用的多字节编码不超过 2 个字节,因此具有更多字节的代码页(例如 UTF-8(以及 GB 18030、cp54936))无法使用被设置为区域设置。
\nhttps://en.wikipedia.org/wiki/Unicode_in_Microsoft_Windows#UTF-8
\n
因此,在读/写等函数中允许使用 UTF-8,但在用作语言环境时则不允许使用 UTF-8
\n不过微软终于解决了这个问题,所以现在我们可以使用 UTF-8 作为语言环境。事实上,MS 甚至-A
再次开始推荐 ANSI API (),而不是像以前那样推荐 Unicode ( -W
) 版本。MSVC 中有一些新选项:/execution-charset:utf-8
和/utf-8
设置字符集,或者您也可以在 UWP 应用程序的 appxmanifest 中设置 ActiveCodePage 属性
自 Windows 10 Insider Build 17035 起,在引入这些选项之前,还添加了“Beta:使用 Unicode UTF-8 进行全球语言支持”复选框,用于将区域设置代码页设置为 UTF-8
\n\n要打开该对话框,请打开“开始”菜单,键入“区域”,然后选择区域设置 > 其他日期、时间和区域设置 > 更改日期、时间或数字格式 > 管理
\n启用后,您可以调用setlocale()
更改为 UTF-8 语言环境:
\n\n从 Windows 10 内部版本 17134(2018 年 4 月更新)开始,通用 C 运行时支持使用 UTF-8 代码页。这意味着
\n\nchar
传递给 C 运行时函数的字符串将需要 UTF-8 编码的字符串。要启用 UTF-8 模式,请在使用 时使用“UTF-8”作为代码页setlocale
。例如,setlocale(LC_ALL, ".utf8")
将使用当前默认的 Windows ANSI 代码页 (ACP) 作为区域设置,并使用 UTF-8 作为代码页。
您也可以在较旧的 Windows 版本中使用它
\n\n\n要在 Windows 10 之前的操作系统(例如 Windows 7)上使用此功能,您必须使用应用程序本地部署或使用 Windows SDK 版本 17134 或更高版本进行静态链接。对于 17134 之前的 Windows 10 操作系统,仅支持静态链接。
\n
_setmbcp()
是VC++ RTL函数,而不是Win32 API函数.它只影响RTL解释字符串的方式.它对Win32 API A
函数没有任何影响.当他们在W
内部调用对方时,A
函数总是使用MultiByteToWideChar()
并WideCharToMultiByte()
指定代码页0(CP_ACP
)以使用系统默认的Ansi代码页进行转换.
基本上他的解释是,尽管 Windows API 函数的“ANSI”版本旨在处理不同的代码页,但历史上有一个隐含的期望,即字符编码每个代码点最多需要两个字节。UTF-8 不符合这种期望,现在更改所有这些功能需要进行大量测试。
归档时间: |
|
查看次数: |
5340 次 |
最近记录: |