gpt4 book ai didi

c - 如何修复传递给 pango_layout_set_text() 的无效 UTF-8 字符串

转载 作者:行者123 更新时间:2023-12-05 01:24:46 25 4
gpt4 key购买 nike

我从使用 gtk+ 的应用程序中收到以下警告:

(foo:11333): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

发出警告的函数如下:

static void show_error(GtkWindow *parent, const gchar *fmt, ...)
{
GtkWidget *dialog;
va_list args;

va_start(args,fmt);
dialog = gtk_message_dialog_new(parent,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
fmt,
args);

(void)gtk_dialog_run(GTK_DIALOG(dialog));

gtk_widget_destroy(dialog);
va_end(args);
}

我正在调用 ui_show_error(window, "error cannot read file %s", filename);

其中 filename 是以 null 结尾的字符串,它适用于 str*()*printf() 函数系列。

如何解决这个问题?

最佳答案

不可能以这种方式链接 va_list 参数。参见 this faq entry .发生的事情是 gtk_message_dialog_new 将 va_list 参数(具有一些编译器定义的格式)解释为指向字符串的指针,因此您得到了垃圾。由于没有采用 va_list 的消息对话框函数,您唯一的选择是使用 vsprintf 或类似的 glib 函数之一构建一个字符串,并将其作为一个参数传递给 gtk_message_dialog_new,格式如 "%s ”。

要在未知格式字符串的情况下构建字符串,通常的技术是使用“n”变体之一,例如具有较大缓冲区的 vsnprintf,如果发生截断,则增加缓冲区大小并重做。但是,glib 有 g_vasprintf(),它会为您分配缓冲区。它还具有 g_printf_string_upper_bound(),可用于根据格式字符串调整缓冲区大小。

关于c - 如何修复传递给 pango_layout_set_text() 的无效 UTF-8 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13115816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com