C++ Windows C+中的输入编码问题+;
我正在使用Visual Studio 2013开发一个简单的C++ Windows C+中的输入编码问题+;,c++,windows,C++,Windows,我正在使用Visual Studio 2013开发一个简单的控制台应用程序 int _tmain(int argc, _TCHAR* argv[]) { std::wstring name; std::wcout << L"Enter your name: "; std::wcin >> name; std::wcout << L"Hello, " << name << std::endl;
控制台应用程序
int _tmain(int argc, _TCHAR* argv[])
{
std::wstring name;
std::wcout << L"Enter your name: ";
std::wcin >> name;
std::wcout << L"Hello, " << name << std::endl;
system("pause");
return 0;
}
问题是如果我在
std::wcout << L"Hello, " << name << std::endl;
std::wcout问题在于默认情况下Windows控制台已损坏
问题源于Windows在控制台应用程序中使用与Windows应用程序中不同的8位代码页。默认情况下,在西方Windows版本中,默认8位代码页(称为ANSI)为Windows-1252,而控制台8位代码页(称为OEM)为CP850
由于您的程序不知道是从控制台读取还是从重定向的文件读取,所以它只是假设ANSI输入。但当您键入Á
时,它实际上是来自以下位置的代码点:0xB5
。然后将其解释为µ
,即Unicode字符U+00B5。有趣的是,当您将其打印到控制台时,会发生逆变换,您会再次看到一个Á
。两错一对
但当您想在非控制台上下文中使用该字符时,它实际上是一个µ
您可能认为您可以从OEM转换为ANSI,然后从ANSI转换为Unicode,这似乎是可行的。。。直到您以以下方式运行程序:
c:\> myprogram < input.txt
你又做错了
有很多选择,但没有一个是完全可行的。至少应该使用Unicode字体,然后使用更普通的代码页。类似于chcp 1252
更改OEM代码页以匹配ANSI代码页。默认情况下,您甚至可以使用一点注册表foo对其进行配置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP=1252
问题是Windows控制台在默认情况下是坏的
问题源于Windows在控制台应用程序中使用与Windows应用程序中不同的8位代码页。默认情况下,在西方Windows版本中,默认8位代码页(称为ANSI)为Windows-1252,而控制台8位代码页(称为OEM)为CP850
由于您的程序不知道是从控制台读取还是从重定向的文件读取,所以它只是假设ANSI输入。但当您键入Á
时,它实际上是来自以下位置的代码点:0xB5
。然后将其解释为µ
,即Unicode字符U+00B5。有趣的是,当您将其打印到控制台时,会发生逆变换,您会再次看到一个Á
。两错一对
但当您想在非控制台上下文中使用该字符时,它实际上是一个µ
您可能认为您可以从OEM转换为ANSI,然后从ANSI转换为Unicode,这似乎是可行的。。。直到您以以下方式运行程序:
c:\> myprogram < input.txt
你又做错了
有很多选择,但没有一个是完全可行的。至少应该使用Unicode字体,然后使用更普通的代码页。类似于chcp 1252
更改OEM代码页以匹配ANSI代码页。默认情况下,您甚至可以使用一点注册表foo对其进行配置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP=1252
我认为您需要更改源文件的编码,比如utf-16。问题是命令提示符使用的编码与Win32 API不同。这个问题的答案有用吗?我认为您需要更改源文件的编码,比如utf-16。问题是命令提示符使用的编码与Win32 API不同。这个问题的答案有用吗?
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP=1252