如何在C++中正确显示用户首选区域设置中的字符串?

mefy6pfw  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(111)

我在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
上面的 ASCIIEBCDIC 的转换只是一个例子,我在寻找一个通用的解决方案,而不仅仅是 ASCIIEBCDIC 的情况。

nuypyhwy

nuypyhwy1#

C++标准库并不是真的设计来帮助你在这种情况下。你要么自己处理重新编码,要么使用宽字符流。然后你必须把你的字符串解码成宽字符串,把它们写入流中,然后流将使用它所注入的语言环境/编码来重新编码字符串。
但是你写的应用程序对你来说真的很重要吗?对于大多数应用程序来说,只写UTF8就可以了,因为这是所有现代终端都应该配置的。

相关问题