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);

wherefilenameはヌル終了文字列でstr*()あり、*printf()関数ファミリに対して正常に機能します。

これを修正する方法は?

4

3 に答える 3

4

そのように va_list 引数をチェーンすることはできません。このよくある質問のエントリを参照してください。何が起こっているかとgtk_message_dialog_newいうと、va_list 引数 (コンパイラで定義された形式を持つ) を文字列へのポインタとして解釈しているため、ガベージが発生しています。va_list を取るメッセージ ダイアログ関数がないため、唯一の選択肢は、vsprintf または同様の glib 関数の 1 つを使用して文字列を作成し、gtk_message_dialog_new"%s" のような形式で 1 ​​つの引数として渡すことです。

不明なフォーマット文字列に直面して文字列を構築するには、通常、大きなバッファのように「n」バリアントのいずれかを使用vsnprintfし、切り捨てが発生した場合はバッファ サイズを増やしてやり直します。ただし、glib には がg_vasprintf()あり、バッファが割り当てられます。またg_printf_string_upper_bound()、フォーマット文字列に基づいてバッファーのサイズを変更するために使用できるものもあります。

于 2012-10-29T18:56:38.383 に答える
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 に答える