简短的问题:有没有办法强制glib的g_print()
使用UTF-8编码?
我遇到的问题是g_print()
seems to do character set conversion基于g_get_charset()
的返回值。现在文档不幸提到了
在Windows上,此函数返回的字符集是所谓的系统默认ANSI代码页。
然而现在可以使用现代控制台:默认情况下,MSYS控制台通常支持(和使用)UTF-8,甚至可以将默认的Windows控制台设置为使用UTF-8编码。
现在看来Windows终于赶上了,并且glib将我限制在一个255个字符的代码页中
我只是简单地将代码切换为普通printf
,但不幸的是{gid}和gtk库中的许多位置调用了g_print
,以及它们的C ++绑定glibmm和gtkmm,我显然不容易有可能改变任何关于修补和编译glib的事情,所以我真的希望有解决方案。
注意:刚刚在local_glib_print_func()
的定义中看到了调用g_print()
的部分。 Aynbody知道这是关于什么的,以及我是否可以将它用于我的目的?
答案 0 :(得分:2)
嗯,实际上我给了自己正确的提示:
在我的问题中调查 Note 时,我发现了函数g_set_print_handler
,它允许创建一个替换默认机制的任意处理程序,并绕过字符转换。
以下最小打印处理程序让我使用g_print()
打印到控制台,避免任何不需要的字符集转换:
#include <cstdio>
#include <glib.h>
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
或使用以下API函数以编程方式手动将控制台的编码设置为UTF-8
#include <windows.h>
// 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终端进行测试)。