3

我从使用 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 canno't read file %s", filename);

哪里filename是空终止字符串,它适用于str*()*printf()函数系列。

如何解决这个问题?

4

3 回答 3

4

以这种方式链接 va_list 参数是不可能的。请参阅此常见问题解答条目。正在发生的事情是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()可用于根据格式字符串调整缓冲区大小的方法。

于 2012-10-29T18:56:38.383 回答
1

我在 Linux From Scratch (LFS) 构建中遇到了这个问题。问题是影响 java swing 界面文本输入,gdk 界面文本输入,有时会默默地忽略输入,如文本字段被禁用。原因是没有任何 UTF8 语言环境。就我而言:

$ locale -a
C
POSIX
pt_BR
pt_BR.iso88591

所以,为了解决我确实定义了一个新的语言环境类型 utf8,比如:

localedef -i pt_BR -f UTF-8 pt_BR.UTF-8

在此之后,一切都变得有用并且没有更多的警告。至少在我的情况下。

于 2013-05-18T20:17:41.803 回答
0

OP 没有显示实际的字符串,ui_show_error 函数在哪里?什么Gtk+版本?默认情况下 gtk_message_dialog_new "use-markup" 属性为 FALSE,所以帖子中是否缺少某些内容?

你可以这样做:

msg = g_vasprintf(fmt, args);

if (strstr(msg, "</"))
  msg_has_markup = TRUE;

dialog = g_object_new (GTK_TYPE_MESSAGE_DIALOG,
                       "message-type",         GTK_MESSAGE_ERROR,
                       "text",                 msg,
                       "use-markup",           msg_has_markup,
                       "buttons",              GTK_BUTTONS_OK,
                        NULL);
g_free (msg);

请注意,如果文件名字符串包含在“<>”中,您仍然会收到相同的错误消息,即</home/somebody会导致令人讨厌的 pango 消息。要么不使用“<>”,要么不使用 pango。

于 2014-10-20T05:32:31.053 回答