在glib的“g_print()”中强制UTF-8编码

简短的问题:有没有办法强制glib的g_print()使用UTF-8编码?

我遇到的问题是g_print() 似乎根据g_get_charset()的返回值进行字符集转换 。 不幸的是,文档提到了

在Windows上,此函数返回的字符集是所谓的系统默认ANSI代码页。

但是现在可以使用现代控制台:默认情况下,MSYS控制台通常支持(和使用)UTF-8,甚至可以将默认的Windows控制台设置为使用UTF-8编码。

现在看来Windows终于赶上了,glib将我限制在一个255个字符的代码页之后???
我只是将我的代码切换到普通的printf但不幸的是g_print在glib和gtk库中的许多位置调用,以及他们的C ++绑定glibmm和gtkmm,我显然没有简单的可能性来改变那些缺少修补和自己编译glib,所以我真的希望有一个解决方案。


注意:刚刚在g_print()的定义中看到了调用local_glib_print_func()的部分。 Aynbody知道这是什么,如果我可以为我的目的利用它?

好吧,事实上我给了自己正确的提示:

在调查我的问题中的Note时 ,我发现了函数g_set_print_handler ,它允许创建一个替换默认机制的任意处理程序,并绕过字符转换。

下面的最小打印处理程序让我使用g_print()打印到控制台,避免任何不需要的字符集转换:

 #include  #include  void g_print_no_convert(const gchar *buf) { fputs(buf, stdout); } int main (int argc, char **argv) { g_set_print_handler(g_print_no_convert); g_print("UTF-8 string"); return 0; } 

注意:写入UTF-8字符串显然只有在控制台的编码实际上是UTF-8时才有效。


在Windows上,您可以通过执行命令chcp 65001手动将控制台的编码设置为UTF-8,或使用以下API函数以编程方式将控制台的编码设置为UTF-8

 #include  // temporarily switch console encoding to UTF8 const unsigned int initial_cp = GetConsoleOutputCP(); SetConsoleOutputCP(CP_UTF8); {...} // printing // switch back to initial console encoding SetConsoleOutputCP(initial_cp); 

这种方法可以轻松地将UTF-8字符串打印到Windows控制台(使用默认控制台以及Windows 10上的MSYS2终端进行测试)。