繁体   English   中英

如何在 C++ 的用户首选语言环境中正确显示字符串?

[英]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

上面的ASCIIEBCDIC的场景只是作为一个例子。 我正在寻找一个通用的解决方案,而不仅仅是针对ASCIIEBCDIC的情况。

C++ 标准库并不是真正为在这种情况下帮助您而设计的。 您要么必须自己处理重新编码,要么使用宽字符流。 然后你将把你的字符串解码成宽字符串,将它们写入 stream,然后 stream 将使用它所包含的语言环境/编码来重新编码字符串。

但是你写的是什么应用程序,这对你来说真的很重要吗? 对于大多数应用程序来说,只写 UTF8 应该没问题,因为这是所有现代终端都应该配置的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM