我在another question中发布了以下代码:
auto operator<<(std::ostream& out, const std::u8string_view str) -> std::ostream& {
std::locale::global(std::locale{".utf8"});
auto& ret = out << std::string_view{std::bit_cast<const char*>(str.data()), str.size()};
std::locale::global(std::locale{""});
return ret;
}
我本打算在打印之前将u8string
转换为用户首选的语言环境,但在this answer中,@Chronial指出我错误地使用了global
环境。
我认为outstreams解释global
编码的数据,并在编写时将其转换为imbue
'd编码,因此,由于我输入的数据是utf8
的,并且我希望在用户首选的语言环境中显示它,因此我更改了global
,并没有在上面的代码中使用imbue
。
例如:如果我的终端使用 EBCDIC,而我的应用程序中有 ASCII 字符串,正确的显示过程是什么?直接显示它们会产生乱码,AFAIK。
我的想法是,如果我将global
设置为 ASCII,将imbue
设置为 EBCDIC,这将使流将数据解释为 ASCII,并在打印之前将其转换为 EBCDIC。
上面的 ASCII 到 EBCDIC 的转换只是一个例子,我在寻找一个通用的解决方案,而不仅仅是 ASCII 到 EBCDIC 的情况。
1条答案
按热度按时间nuypyhwy1#
C++标准库并不是真的设计来帮助你在这种情况下。你要么自己处理重新编码,要么使用宽字符流。然后你必须把你的字符串解码成宽字符串,把它们写入流中,然后流将使用它所注入的语言环境/编码来重新编码字符串。
但是你写的应用程序对你来说真的很重要吗?对于大多数应用程序来说,只写UTF8就可以了,因为这是所有现代终端都应该配置的。