我现在在C ++中使用 unicode 工作了几天,对我来说还不清楚。我对它的用法有一些疑问,如果可以回答,我将很高兴。目的只是使输出是具有正确unicode的字符串。
据我所知,当字符破损时将``。就像您尝试将wchat_t转换为字符时一样。
关于我的机器 作业系统:kubuntu 19.10
g++ --version
g++ (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1。为什么此功能只能作为std :: string来存储“é”不是的字符?
setlocale(LC_ALL, "en_US.utf8");
std::cout << "é" << std::endl;
output: é
2。打印wchar_t非常奇怪。为什么显示以下输出?
setlocale(LC_ALL, "en_US.utf8");
wchar_t a = L'é';
std::cout << a << std::endl;
output: 233
setlocale(LC_ALL, "en_US.utf8");
wchar_t a = L'é';
std::wcout << a << std::endl;
output: �
setlocale(LC_ALL, "en_US.utf8");
wchar_t a = L'é';
printf("%lc\n", a);
output: é
setlocale(LC_ALL, "en_US.utf8");
wchar_t a = L'é';
wprintf(L"%lc\n", a);
output: é
PS:this source建议使用setlocale(LC_ALL,“ en_US.utf8”)。否则,std :: wcout会打印问号,而不是正确的字符。
答案 0 :(得分:2)
g ++使用UTF-8作为其默认执行字符集。您可以使用-fexec-charset=
进行更改,但这意味着您在第一个示例中的“é”以UTF-8编码。
2.a没有operator<<
接受ostream
和wchar_t
。这意味着后者将被提升并显示为数字(像wchar_t
这样的char
是整数类型。
另一个正在按预期工作。我认为不需要更多的解释。需要注意的一件事是,需要正确配置您的环境。这就是为什么我要求您通过| od -t x1
中的输出来检查输出是否为预期的输出。实际上,该问题是显示问题,如果仍然存在,则必须检查终端仿真器的配置。