【问题标题】:Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text() in GTK CPango-WARNING **:在 GTK C 中传递给 pango_layout_set_text() 的 UTF-8 字符串无效
【发布时间】:2017-05-03 07:02:19
【问题描述】:

我在我的 gtk 应用程序中收到上述警告。我知道这个问题已经讨论过了,但我的问题是我什至没有使用这个功能。

我所做的只是从文件中读取文本字符串,然后使用 pango 更改其字体类型和字体大小,然后将结果应用到 gtk 标签中,代码如下:

 FILE *fp;
 long lSize;
 char *buffer;

 fp = fopen ( "/home/user/file.txt" , "rb" );
 if( !fp ) perror("file.txt"),exit(1);

 fseek( fp , 0L , SEEK_END);
 lSize = ftell( fp );
 rewind( fp );

 buffer = calloc( 1, lSize+1 );
 if( !buffer ) fclose(fp),fputs("memory alloc fails",stderr),exit(1);


 if( 1!=fread( buffer , lSize, 1 , fp) )
   fclose(fp),free(buffer),fputs("entire read fails",stderr),exit(1);

 buffer[lSize+2]='\0';

 PangoFontDescription *font = pango_font_description_new ();    //NEW PANGO FONT
 pango_font_description_set_family (font,"Arial Rounded MT Bold");          //FONT FAMILY
 pango_font_description_set_size(font,60*PANGO_SCALE);  //FONT SIZE
 gtk_widget_override_font(GTK_WIDGET(label), font);         //APPLYING THE NEW FONT

 gtk_label_set_text(GTK_LABEL(label),buffer);

如何消除此错误?

编辑:

我删除了 pango 代码并使用了 gtk_set_markup

char *str = g_strdup_printf ("<span font=\"20\" color=\"white\">" "%s""</span>",buffer);
gtk_label_set_markup (GTK_LABEL (label), str);

问题是如果字体大小为 20 或更低,那么它在全屏时显示正常,但如果我将字体大小增加到 30 或 40,那么它会给出相同的警告,并且窗口也会调整大小,如下所示:

正常情况下,字体较小,如下所示:

【问题讨论】:

  • 请使用g_file_get_contents()之类的东西来读取文件——我认为你的代码不安全,至少你在缓冲区结束后写了终止符。
  • @jku 我不知道 g_file_contents()。我现在正在使用它,但问题仍然与我的编辑相同。
  • 您的文件中一定有一些 utf8 错误。
  • @JoséFonte 它与文件无关。我也试过这个char *str = g_strdup_printf ("&lt;span font=\"20\" color=\"white\"&gt;" "%s""&lt;/span&gt;","Text which I want to display");它仍然给出错误
  • 你不使用它,但 gtk 使用它,gtk.label 正在使用它,这意味着你的文件内容中有 utf8 错误

标签: c gtk pango


【解决方案1】:

GTK+ 小部件要求所有用户可见字符串都使用 UTF-8 编码文本。

在加载到任何 GTK+ 小部件之前,您必须确保正在加载的文件的内容使用 UTF-8 进行编码。您可以使用 GLib 提供的character set conversion API,如g_convert() 或g_locale_to_utf8()。

我还建议使用 GIO API 来加载文件内容,即g_file_load_contents_async(),因为它不会在从任意慢速存储加载任意大小的文件时阻塞 UI。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2023-03-23
    • 2011-05-10
    • 2011-04-22
    • 2013-12-22
    • 2010-11-28
    • 2017-03-04
    相关资源
    最近更新 更多