为什么Windows使用ANSI代码页而不是UNICODE?

4
当我在cmd.exe窗口中运行chcp命令时,它代表了Windows使用的代码页。
我认为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等是否具有不同的字符集大小?
我很困惑。请有人做出定义。

更改控制台的代码页只会影响非 Unicode 应用程序。据我所知,控制台仍然只支持 UCS-2,但当然大多数 Windows 应用程序都是 GUI 应用程序,不使用控制台。 - Harry Johnston
1
@RbMm,我认为您是指当前控制台,而不仅仅是连接到控制台的CMD shell。CMD只是一个控制台客户端应用程序,就像任何其他控制台应用程序一样。chcp.com是一个简单的控制台应用程序,调用GetConsoleCPSetConsoleCPSetConsoleOutputCP。它不允许独立设置输出代码页而不影响输入代码页。值得注意的是,当将其用作通用文件时,通过ReadFileWriteFile使用控制台的输入和输出代码页,其中不支持UTF-16LE(代码页1200)。 - Eryk Sun
谢谢您的回复。我添加了第四个问题,请回答它。 - JaeHyeok Kim
@eryksun - 是的 :) 如果我说得准确的话,我是指控制台服务器进程conhost.exe,附加了cmd.exechcp.com。从连接到控制台(conhost.exe)的任何进程中调用SetConsole[Output]CP都会导致在conhost.exe中调用SrvSetConsoleCP,实际上设置了CP。因此,CP只是conhost.exe中的变量/状态,并影响附加到它的进程。如果我们从当前的cmd运行新的cmd - 它也将对其产生影响(连接到同一个conhost.exe),但是如果从资源管理器执行cmd,则会有单独的conhost.exe,对其没有影响。 - RbMm
从Windows Vista开始,此函数完全符合UTF-8和UTF-16的Unicode 4.1规范。 - RbMm
显示剩余7条评论
1个回答

6
  • 历史原因和向后兼容性。Windows本身是基于Unicode的操作系统,自NT时代以来就一直如此。但许多遗留的(甚至现有的)应用程序并没有为Unicode编写。启用了Unicode的应用程序不使用ANSI代码页,除非它们需要在ANSI和Unicode之间转换运行时数据。

  • Microsoft在Windows 2000中切换到UTF-16。在此之前,它使用UCS-2。请参见《Unicode in Microsoft Windows》

  • UTF-16和UCS-2只是同一Unicode字符集的编码方式。UTF-16是为支持编码U+FFFF以上的代码点而发明的,而UCS-2无法处理这些代码点。

  • 所有UTF(包括您未命名的许多UTF)都只是同一Unicode字符集的编码方式。名称中指定的数字是编码的代码单元中使用的位数(UTF-8使用8位代码单元,UTF-16使用16位代码单元等)。


1
UTF-16是一种字符编码。UCS-2是一个字符集。当Windows NT开始开发时,它们本质上是相同的东西。从数字上来看,而不是从语义上来看。这个区别并不是很重要,直到Windows 2000出现,正如你在第2和第3个要点中指出的那样。 - IInspectable
@RemyLebeau,wchar_t在处理Unicode方面做得更好,因为它支持最多两个字节。但它仍然不支持Unicode编码。当然,它也排除了UTF-8,而在使用大部分西方字符串的程序中,应该使用UTF-8以避免内存浪费。 - Barnack
@RemyLebeau 我的意思是wchar_t只处理2字节字符,并且将适用于最多占用2个字节的utf-16字符。 对于占用更多字节的字符,它不会有问题吗? - Barnack
1
@Barnack 在 Windows 2000 之前,wchar_t 被解释为 UCS-2,但自 2000 年以来,wchar_t 现在被解释为 UTF-16。至于 char 和 UTF-8,在大多数版本的 Windows 中都不理解 UTF-8(除了一些孤立的情况,例如 MultiByteToWideChar()/WideCharToMultiByte() API、fopen() 的扩展、cmd 控制台的 chmod 命令等)。但是在 Windows 10 内部版本 17035 中,微软终于向传统的 Win32 ANSI API 添加了 UTF-8 代码页支持(即将 char 字符串解释为 UTF-8 而不是作为 ANSI),但该功能目前处于测试阶段。 - Remy Lebeau
在高级语言设置中,有一个选项可以更改为UTF8。(Beta)更改它并查看安装软件和Windows本身如何崩溃。这不仅仅是微软,还有其他第三方开发人员的遗留问题,阻止了Unicode或UTF8在Windows中的成功适应。 - theking2
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接