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

C++ - Why isn't the unicode output correct?

本文关键字:不正确 输出 unicode 为什么 C++      更新时间:2023-10-16

我现在在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("%lcn", a);
output: é
setlocale(LC_ALL, "en_US.utf8");
wchar_t a = L'é';
wprintf(L"%lcn", a);
output: é

PS:setlocale(LC_ALL,"en_US.utf8"(是这个来源所建议的。否则,std::wcout 将打印问号而不是正确的字符。

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

  • 2.a 没有operator<<参加ostreamwchar_t。 这意味着后者被提升并显示为数字(wchar_tchar是整数类型(。

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