[英]How to correctly display strings in user preferred locale in C++?
我在另一个问题中发布了这段代码:
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
转换为用户首选的语言环境。 但是在对该帖子的回答中,@Chronial 指出我错误地使用了global
语言环境。
我认为 outstreams 解释global
编码中的数据,并在写入时将其转换为imbue
的编码。 因此,由于我提供的数据是utf8
格式并且我想在用户首选的语言环境中显示它,所以我更改了global
并且没有在上面的代码中触及imbue
。
例如:如果我的终端正在使用EBCDIC并且我的应用程序中有ASCII字符串,正确显示它们的正确程序是什么? 直接显示它们会产生乱码,AFAIK。
我的想法是,如果我将global
设置为ASCII并注入EBCDIC ,这将使imbue
将数据解释为ASCII并在打印前将其转换为EBCDIC 。
上面的ASCII转EBCDIC的场景只是作为一个例子。 我正在寻找一个通用的解决方案,而不仅仅是针对ASCII到EBCDIC的情况。
C++ 标准库并不是真正为在这种情况下帮助您而设计的。 您要么必须自己处理重新编码,要么使用宽字符流。 然后你将把你的字符串解码成宽字符串,将它们写入 stream,然后 stream 将使用它所包含的语言环境/编码来重新编码字符串。
但是你写的是什么应用程序,这对你来说真的很重要吗? 对于大多数应用程序来说,只写 UTF8 应该没问题,因为这是所有现代终端都应该配置的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.