避免/设置std :: cout / std :: cerr的字符集转换/编码

时间:2017-05-11 21:33:58

标签: c++ libstdc++

一般问题

写入std::cout / std::cerr时是否有可能避免字符集转换? 我喜欢

std::cout << "Ȋ'ɱ ȁ ȖȚƑ-8 Șțȓȉɳɠ (in UTF-8 encoding)" << std::endl;

我希望将输出写入控制台,保持UTF-8编码(我的控制台使用UTF-8编码,但我的C ++标准库,GNU libstdc++,并不这么认为某种原因)。

如果没有可能禁止字符编码转换:我可以设置std::cout使用UTF-8,所以它希望自己能够确定不需要转换吗?


背景

我使用Windows API函数SetConsoleOutputCP(CP_UTF8);将控制台的编码设置为UTF-8。 问题似乎是UTF-8与通常用于我系统的语言环境的代码页不匹配,libstdc++因此使用默认的ANSI代码页设置std::cout而不是正确识别开关。


编辑:原来我错误解释了这个问题,解决方案实际上要简单得多(或者不是......)。

"Ȋ'ɱ ȁ ȖȚƑ-8 Șțȓȉɳɠ (in UTF-8 encoding)"只是作为占位符(我不应该使用它,因为它隐藏了实际问题)。

在我的真实代码中,&#34; UTF-8字符串&#34;是Glib::ustring,根据定义,这些是UTF-8编码的。 但是我没有意识到输出操作符<<是强制字符集转换的defined in glibmm
它在内部使用g_locale_from_utf8(),然后使用g_get_charset()来确定目标编码。

不幸的是g_get_charset()州的文档

  

在Windows上,此函数返回的字符集是所谓的系统默认ANSI代码页。这是&#34; narrow&#34;使用的字符集。处理文件名的C库和Win32函数的版本。它可能与C库当前语言环境使用的字符集不同。

这意味着glib既不关心我设置的C语言环境也不会尝试确定我的控制台实际使用的编码,并且基本上不可能使用许多glib函数来创建UTF-8输出。 (事实上​​,这也意味着此问题与触发我的其他问题的问题具有完全相同的原因:Force UTF-8 encoding in glib's "g_print()")。

我目前正在考虑这个glib中的错误(或者说是最严重的限制),并且可能会在问题跟踪器中为它打开报告。

0 个答案:

没有答案