是否有正确的方法以 UTF-8 编码从控制台接收输入?
Is there a proper way to receive input from console in UTF-8 encoding?
在 windows 中从 std::cin
获取输入时,输入显然总是采用编码 windows-1252(在我的情况下主机的默认设置)尽管所有配置,显然只影响输出。在 UTF-8 编码中是否有正确的方法来捕获 windows 中的输入?
例如,让我们看看这个程序:
#include <iostream>
int main(int argc, char* argv[])
{
std::cin.imbue(locale("es_ES.UTF-8"));
std::cout.imbue(locale("es_ES.UTF-8"));
std::cout << "ñeñeñe> ";
std::string in;
std::getline( std::cin, in );
std::cout << in;
}
我在具有西班牙语语言环境的 windows 机器上使用 visual studio 2022 编译了它。源代码是UTF-8。执行生成的程序时(windows powershell 会话,执行 chcp 65001
将默认编码设置为 UTF-8 后),我看到以下内容:
PS C:\> .\test_program.exe
ñeñeñe> ñeñeñe
e e e
第一个“ñeñeñe”是正确的:它在输出控制台上正确显示了“ñ”字符。到目前为止,一切都很好。用户输入正确地回显到控制台:另一个好处。但!当它将编码的字符串发送回输出时,“ñ”字符被空 space.
替换
在调试这个程序时,我看到变量“in”捕获了一种不是 utf-8 编码的输入:对于“ñ”它只使用一个字符,而在 utf-8 中字符必须消耗两个。结论是输入对 chcp
命令没有影响。我做错了什么吗?
更新
有人让我看看更改为 wcout/wcin:
时会发生什么
std::wcout << u"ñeñeñe> ";
std::wstring in;
std::getline(std::wcin, in);
std::wcout << in;
行为:
PS C:\> .\test.exe
0,000,7FF,6D1,B76,E30ñeñeñe
e e e
其他尝试(将字符串设置为 L"ñeñeñe"):
ñeñeñe> ñeñeñe
e e e
保持原样:
std::wcout << "ñeñeñe> ";
结果是:
eee>
这是目前为止我找到的最接近的解决方案:
int main(int argc, char* argv[])
{
_setmode(_fileno(stdout), _O_WTEXT);
_setmode(_fileno(stdin), _O_WTEXT);
std::wcout << L"ñeñeñe";
std::wstring in;
std::getline(std::wcin, in);
std::wcout << in;
return 0;
}
解决方案 的方向是正确的。问题:stdin 和 stdout 应该在相同的配置中,因为控制台的 echo 会重写输入。问题是用 \uXXXX 代码编写字符串....我在猜测如何克服它或使用 #define
来克服和澄清文本文字
在 windows 中从 std::cin
获取输入时,输入显然总是采用编码 windows-1252(在我的情况下主机的默认设置)尽管所有配置,显然只影响输出。在 UTF-8 编码中是否有正确的方法来捕获 windows 中的输入?
例如,让我们看看这个程序:
#include <iostream>
int main(int argc, char* argv[])
{
std::cin.imbue(locale("es_ES.UTF-8"));
std::cout.imbue(locale("es_ES.UTF-8"));
std::cout << "ñeñeñe> ";
std::string in;
std::getline( std::cin, in );
std::cout << in;
}
我在具有西班牙语语言环境的 windows 机器上使用 visual studio 2022 编译了它。源代码是UTF-8。执行生成的程序时(windows powershell 会话,执行 chcp 65001
将默认编码设置为 UTF-8 后),我看到以下内容:
PS C:\> .\test_program.exe
ñeñeñe> ñeñeñe
e e e
第一个“ñeñeñe”是正确的:它在输出控制台上正确显示了“ñ”字符。到目前为止,一切都很好。用户输入正确地回显到控制台:另一个好处。但!当它将编码的字符串发送回输出时,“ñ”字符被空 space.
替换在调试这个程序时,我看到变量“in”捕获了一种不是 utf-8 编码的输入:对于“ñ”它只使用一个字符,而在 utf-8 中字符必须消耗两个。结论是输入对 chcp
命令没有影响。我做错了什么吗?
更新
有人让我看看更改为 wcout/wcin:
时会发生什么std::wcout << u"ñeñeñe> ";
std::wstring in;
std::getline(std::wcin, in);
std::wcout << in;
行为:
PS C:\> .\test.exe
0,000,7FF,6D1,B76,E30ñeñeñe
e e e
其他尝试(将字符串设置为 L"ñeñeñe"):
ñeñeñe> ñeñeñe
e e e
保持原样:
std::wcout << "ñeñeñe> ";
结果是:
eee>
这是目前为止我找到的最接近的解决方案:
int main(int argc, char* argv[])
{
_setmode(_fileno(stdout), _O_WTEXT);
_setmode(_fileno(stdin), _O_WTEXT);
std::wcout << L"ñeñeñe";
std::wstring in;
std::getline(std::wcin, in);
std::wcout << in;
return 0;
}
解决方案 #define
来克服和澄清文本文字