一般问题
写入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中的错误(或者说是最严重的限制),并且可能会在问题跟踪器中为它打开报告。