C ++-为什么unicode输出不正确?

时间:2019-12-09 20:14:02

标签: c++ unicode

我现在在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会打印问号,而不是正确的字符。

1 个答案:

答案 0 :(得分:2)

  • g ++使用UTF-8作为其默认执行字符集。您可以使用-fexec-charset=进行更改,但这意味着您在第一个示例中的“é”以UTF-8编码。

  • 2.a没有operator<<接受ostreamwchar_t。这意味着后者将被提升并显示为数字(像wchar_t这样的char是整数类型。

另一个正在按预期工作。我认为不需要更多的解释。需要注意的一件事是,需要正确配置您的环境。这就是为什么我要求您通过| od -t x1中的输出来检查输出是否为预期的输出。实际上,该问题是显示问题,如果仍然存在,则必须检查终端仿真器的配置。