【发布时间】:2017-10-11 00:20:30
【问题描述】:
当我在cmd.exe 窗口中运行命令chcp 时,它代表Windows 中使用的代码页。
我认为 Windows 使用 UNICODE 字符集。
所以,我的问题是:
为什么 Windows 使用 ANSI 代码页而不是 Unicode?p>
Windows 使用 UTF-16 还是 UCS-2?我可以检查这个(通过命令或 MSDN 链接)吗?
UTF-16 或 UCS-2 只是一种编码?还是也是一个字符集?
UTF-8, UTF-16, UTF-32, etc .. 它们有不同的字符集大小吗?
我很困惑。请有人定义它们。
【问题讨论】:
-
更改控制台的代码页只会影响非 Unicode 应用程序。 AFAIK 控制台仍然只支持 UCS-2,但当然大多数 Windows 应用程序都是 GUI 并且不使用控制台。
-
控制台中的字符单元使用 16 位字符代码。这限制了它可以向 BMP 显示的内容。可以将 UTF-16 代理对写入相邻单元格,在这种情况下,它们将显示为两个默认字形,例如带框的问号。 FWIW,您可以将代理对复制并粘贴到另一个窗口。控制台也不使用 Uniscribe 或 DirectWrite,因此不支持复杂的脚本、组合字符和自动回退字体。您可以通过注册表中的手动字体链接来提高字形覆盖率。
-
1) 为什么 Windows 使用 ANSI 代码页而不是 UNICODE? 真正的控制台同时使用 Unicode 和多字节 api。所有内部函数都使用 Unicode。显示为 Unicode 的文本。 CP 仅用于翻译输入/输出 Unicode 多字节。如果我们调用
WriteConsoleW,文本将按原样显示,当前 CP 没有任何影响。如果我们调用WriteConsoleA- text first 将通过MultiByteToWideChar转换为 Unicode,CP 将用作此处的第一个参数。所以Aapi 调用结果取决于当前的CP,而W不是。和chcp仅对当前cmd.exe有效 -
@RbMm,我假设您的意思是当前控制台,而不仅仅是连接到控制台的 CMD shell。 CMD 只是一个控制台客户端应用程序,就像任何其他控制台应用程序一样。 chcp.com 是一个简单的控制台应用程序,它调用
GetConsoleCP、SetConsoleCP和SetConsoleOutputCP。它不允许设置独立于输入代码页的输出代码页。值得注意的是,控制台的输入和输出代码页在通过ReadFile和WriteFile用作通用文件时使用,不支持UTF-16LE(代码页1200)。 -
感谢您的回复。我添加了第 4 个问题,请回复。
标签: windows unicode encoding utf-16 ucs2