在glib" g_print()"中强制使用UTF-8编码

时间:2017-05-11 23:59:32

标签: c gtk glib

简短的问题:有没有办法强制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知道这是关于什么的,以及我是否可以将它用于我的目的?

1 个答案:

答案 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终端进行测试)。