当我在Windows中打开cmd.exe时,它使用的是什么编码?

如何检查当前使用的编码?这取决于我的区域设置还是有任何环境变量需要检查?

当您以某种编码方式键入文件时会发生什么?有时我得到乱码(不正确的编码使用),有时它的工作。然而,只要我不知道发生了什么,我就不相信任何事情。有人能解释一下吗?


当前回答

长期以来,我一直为Windows代码页问题以及由此引起的C程序可移植性和本地化问题而感到沮丧。之前的文章已经详细描述了这个问题,所以我不打算在这方面添加任何东西。

长话短说,最终我在Visual c++标准C库之上编写了自己的UTF-8兼容性库层。基本上,这个库可以确保在任何代码页中使用UTF-8的标准C程序正常工作。

这个库名为MsvcLibX,可以在https://github.com/JFLarvoire/SysToolsLib上以开放源代码的形式获得。主要特点:

C sources encoded in UTF-8, using normal char[] C strings, and standard C library APIs. In any code page, everything is processed internally as UTF-8 in your code, including the main() routine argv[], with standard input and output automatically converted to the right code page. All stdio.h file functions support UTF-8 pathnames > 260 characters, up to 64 KBytes actually. The same sources can compile and link successfully in Windows using Visual C++ and MsvcLibX and Visual C++ C library, and in Linux using gcc and Linux standard C library, with no need for #ifdef ... #endif blocks. Adds include files common in Linux, but missing in Visual C++. Ex: unistd.h Adds missing functions, like those for directory I/O, symbolic link management, etc, all with UTF-8 support of course :-).

更多细节请参阅GitHub上的MsvcLibX README,包括如何构建库并在您自己的程序中使用它。

上述GitHub存储库中的发布部分提供了几个使用MsvcLibX库的程序,这些程序将展示其功能。例:试试我的which.exe工具,在PATH中使用非ascii名称的目录,搜索具有非ascii名称的程序,并更改代码页。

另一个有用的工具是convc .exe程序。这个程序可以很容易地将数据流从任何代码页转换为任何其他。它的默认值是在Windows代码页中输入,在当前控制台代码页中输出。这允许在命令控制台上正确地查看Windows GUI应用程序(例如:记事本)生成的数据,使用简单的命令,如:键入WINFILE.txt | conv

这个MsvcLibX库绝不是完整的,欢迎为改进它做出贡献!

其他回答

命令CHCP显示当前代码页。有三位数字:8xx,不同于Windows 12xx。因此,输入纯英语文本不会看到任何区别,但扩展的代码页(如西里尔字母)将被错误地打印出来。

为了回答你的第二个问题,关于编码是如何工作的,Joel Spolsky写了一篇很棒的介绍性文章。强烈推荐。

长期以来,我一直为Windows代码页问题以及由此引起的C程序可移植性和本地化问题而感到沮丧。之前的文章已经详细描述了这个问题,所以我不打算在这方面添加任何东西。

长话短说,最终我在Visual c++标准C库之上编写了自己的UTF-8兼容性库层。基本上,这个库可以确保在任何代码页中使用UTF-8的标准C程序正常工作。

这个库名为MsvcLibX,可以在https://github.com/JFLarvoire/SysToolsLib上以开放源代码的形式获得。主要特点:

C sources encoded in UTF-8, using normal char[] C strings, and standard C library APIs. In any code page, everything is processed internally as UTF-8 in your code, including the main() routine argv[], with standard input and output automatically converted to the right code page. All stdio.h file functions support UTF-8 pathnames > 260 characters, up to 64 KBytes actually. The same sources can compile and link successfully in Windows using Visual C++ and MsvcLibX and Visual C++ C library, and in Linux using gcc and Linux standard C library, with no need for #ifdef ... #endif blocks. Adds include files common in Linux, but missing in Visual C++. Ex: unistd.h Adds missing functions, like those for directory I/O, symbolic link management, etc, all with UTF-8 support of course :-).

更多细节请参阅GitHub上的MsvcLibX README,包括如何构建库并在您自己的程序中使用它。

上述GitHub存储库中的发布部分提供了几个使用MsvcLibX库的程序,这些程序将展示其功能。例:试试我的which.exe工具,在PATH中使用非ascii名称的目录,搜索具有非ascii名称的程序,并更改代码页。

另一个有用的工具是convc .exe程序。这个程序可以很容易地将数据流从任何代码页转换为任何其他。它的默认值是在Windows代码页中输入,在当前控制台代码页中输出。这允许在命令控制台上正确地查看Windows GUI应用程序(例如:记事本)生成的数据,使用简单的命令,如:键入WINFILE.txt | conv

这个MsvcLibX库绝不是完整的,欢迎为改进它做出贡献!

在Java中,我使用编码“IBM850”来写文件。这就解决了问题。

Type

chcp

查看您当前的代码页(正如Dewfy已经说过的)。

Use

nlsinfo

查看所有已安装的代码页,并找出代码页编号的含义。

您需要安装Windows Server 2003资源工具包(适用于Windows XP)才能使用nlsinfo。