在32位Windows上的Visual Studio 2005中,为什么我的控制台不显示128到255之间的字符?
例如:
cout << "¿" << endl; //inverted question mark
输出:
┐
Press any key to continue . . .
在32位Windows上的Visual Studio 2005中,为什么我的控制台不显示128到255之间的字符?
例如:
cout << "¿" << endl; //inverted question mark
输出:
┐
Press any key to continue . . .
cout << "I like Norwegian blåbærsyltetøy!" << endl;
可以使用基于Unicode的控制台窗口API直接向控制台窗口输出Unicode以避免转换,但这很麻烦。请注意,使用wcout
而不是cout
并没有帮助:按设计wcout
仅从宽字符字符串向程序的窄字符集进行转换,并在此过程中丢失信息。可能很难相信,C++标准库提供了一大块非常复杂的功能是无意义的(因为这些转换本可以由cout
支持),但事实就是如此。也许这是某种政治妥协,但无论如何,wcout
都没有帮助,即使它在某种程度上有意义,那么逻辑上它应该帮助解决这个问题。
那么一个挪威的初学者程序员怎么样才能呈现出“blåbærsyltetøy”呢?
很简单,只需将活动代码页更改为ANSI即可。由于在大多数西方国家的PC上,ANSI是代码页1252,因此您可以通过以下方式为给定的命令解释器实例执行此操作:
C:\test> chcp 1252 Active code page: 1252
C:\test> _
现在,像[edit.com]这样的旧DOS程序将产生一些无用的东西,因为ANSI中没有原始PC字符集线绘制字符,而且由于国家字符在ANSI中具有不同的代码。但是,谁使用旧的DOS程序呢?不是我!
如果您希望将其作为更永久的代码页,则必须通过未记录的注册表键更改控制台窗口的配置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
在此键中,将OEMCP
的值更改为1252,并重新启动。
与chcp
或其他更改为代码页1252的操作一样,会导致旧的DOS程序呈现无用的东西,但使C++程序或其他现代控制台程序正常工作。
由于在控制台窗口和Windows的其他部分中都使用相同的字符编码。
当你打印一个ASCII字符串时,Windows会根据当前的代码页将其内部转换为UNICODE。CRT还会进行从UNICODE到“ASCII”的转换。以下内容可以正常工作。
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <iostream>
void
__cdecl
main(int ac, char **av)
{
_setmode(_fileno(stdout), _O_U16TEXT);
std::wcout << L"\u00BF";
}
我正在使用Win10 b19043操作系统。 切换到Unicode代码页(65001)可以在CMD窗口中打印/显示扩展ASCII字符。只需在您的控制台或批处理文件中输入此行,一切都应该正常:
chcp 65001 1>nul
它可能是使用基本的ASCII字符集实现的。在创建控制台时,微软程序员没有添加UTF-8功能。这只是一个猜测,因为我不是参与创建控制台的微软程序员。