Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows C+中的输入编码问题+;_C++_Windows - Fatal编程技术网

C++ Windows C+中的输入编码问题+;

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;

我正在使用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;
    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