gpt4 book ai didi

c++ - 是否可以在 Windows 控制台中使用 Boost 和 STL 打印 UTF-8 字符串?

转载 作者:行者123 更新时间:2023-11-30 05:29:57 25 4
gpt4 key购买 nike

我试图用 cout 输出 UTF-8 编码的字符串,但没有成功。我想在我的程序中使用 Boost.Locale。我发现了一些关于特定于 Windows 控制台的信息。比如这篇文章http://www.boost.org/doc/libs/1_60_0/libs/locale/doc/html/running_examples_under_windows.html说我应该将输出控制台代码页设置为 65001 并将我的所有源代码保存为带有 BOM 的 UTF-8 编码。所以,这是我的简单示例:

#include <windows.h>
#include <boost/locale.hpp>

using namespace std;
using namespace boost::locale;

int wmain(int argc, const wchar_t* argv[])
{
//system("chcp 65001 > nul"); // It's the same as SetConsoleOutputCP(CP_UTF8)
SetConsoleOutputCP(CP_UTF8);

locale::global(generator().generate(""));

static const char* utf8_string = u8"♣☻▼►♀♂☼";

cout << "cout: " << utf8_string << endl;
printf("printf: %s\n", utf8_string);

return 0;
}

我用 Visual Studio 2015 编译它并在控制台中产生以下输出:

cout: ���������������������
printf: ♣☻▼►♀♂☼

为什么 printf 做的好而 cout 做的不好? Boost 的区域设置生成器可以帮助它吗?或者我应该使用其他东西以流模式(类似 cout 的方法)在控制台中打印 UTF-8 文本吗?

最佳答案

看起来 std::cout 在这里太聪明了:它试图将您的 utf8 编码字符串解释为 ascii 字符串,并找到 21 个非 ascii 字符作为未映射字符输出 。 AFAIK Windows C++ 控制台驱动程序坚持将窄字符字符串中的每个字符映射到屏幕上的某个位置,并且不支持多字节字符集。

这是幕后发生的事情:

utf8_string就是下面的char数组(看个Unicode表,做utf8转换):

utf8_string = { '0xe2', '0x99', '0xa3', '0xe2', '0x98', '0xbb', '0xe2', '0x96',
'0xbc', '0xe2', '0x96', '0xba', '0xe2', '0x99', '0x80', '0xe2', '0x99',
'0x82', '0xe2', '0x98', '0xbc', '\0' };

那是 21 个字符,其中没有一个在 ascii 范围 0-0x7f 内。

相反,printf 只是输出字节,没有任何转换给出正确的输出。

很抱歉,但即使经过多次搜索,我也找不到使用窄流(如 std::cout)在 Windows 控制台上正确显示 UTF8 输出的简单方法。

但是您应该注意到您的代码无法将助推器区域设置注入(inject) cout

关于c++ - 是否可以在 Windows 控制台中使用 Boost 和 STL 打印 UTF-8 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36225578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com