2017-10-11 57 views
0

当我在cmd.exe窗口中运行命令chcp时,它表示Windows中使用的代码页。为什么Windows使用ANSI代码页而不是UNICODE?

我认为Windows使用UNICODE字符集。

所以,我的问题是:

  1. 为什么Windows使用ANSI代码页而不是Unicode的?

  2. Windows使用UTF-16或UCS-2?我可以检查这个(通过命令或MSDN链接)?

  3. UTF-16或UCS-2只是一种编码?或者也是一个字符集?

  4. UTF-8,UTF-16,UTF-32等。他们有不同的字符集大小吗?

我很困惑。请有人定义它们。

+0

更改控制台的代码页仅影响非Unicode应用程序。 AFAIK控制台仍然只支持UCS-2,但是当然大多数Windows应用程序都是GUI,不管怎样都不使用控制台。 –

+0

控制台中的字符单元使用16位字符代码。这限制了它可以向BMP显示的内容。一个UTF-16代理对可以写入相邻的单元格,在这种情况下,它们将显示为两个默认字形,例如盒装问号。 FWIW,您可以将代理对复制并粘贴到另一个窗口。该控制台也不使用Uniscribe或DirectWrite,因此不支持复杂脚本,组合字符和自动回退字体。您可以通过注册表中的手动字体链接来改善字形覆盖率。 – eryksun

+0

* 1)为什么Windows使用ANSI代码页代替UNICODE?*真正的控制台使用Unicode和多字节api。所有内部函数都使用Unicode。文本显示为Unicode。 CP仅用于翻译输入/输出Unicode <->多字节。如果我们调用'WriteConsoleW'文本将按原样显示并且当前CP不起作用。如果我们调用'WriteConsoleA',文本将首先通过'MultiByteToWideChar'转换为Unicode,CP将作为第一个参数使用。所以'a' api调用结果取决于当前的CP,而'W'没有。和'chcp'只对目前的'cmd.exe'有效。 – RbMm

回答

3
  1. 历史原因和向后兼容性。 Windows本身是一个基于Unicode的操作系统,自NT时代以来一直是这种操作系统。但许多传统(甚至是当前)的应用程序不是为Unicode编写的。除非需要在ANSI和Unicode之间转换运行时数据,否则启用Unicode的应用程序不使用ANSI代码页。

  2. Microsoft在Windows 2000中切换为UTF-16。在此之前,它使用了UCS-2。见Unicode in Microsoft Windows

  3. UTF-16和UCS-2都是同一个Unicode字符集的编码。发明了UTF-16是为了支持UCS-2无法处理的U + FFFF以上的编码点。

  4. 所有UTF(包括许多你没有命名的)只是同一个Unicode字符集的编码。名称中指定的数字是编码码单元中使用的位数(UTF-8使用8位码单元,UTF-16使用16位码单元等)。

+0

UTF-16是一种字符编码。 UCS-2是一个字符集。在Windows NT上开始工作时,它们基本上是同一件事。数字,而不是语义。在Windows 2000之前,这一点并不重要,正如你在第2点和第3点中指出的那样。 – IInspectable

相关问题