Pango-WARNING **:在GTK C中传递给pango_layout_set_text()的无效UTF-8字符串

时间:2017-05-03 07:02:20

标签: c gtk pango

我在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,那么它会给出相同的警告,窗口也会调整如下: enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分:4)

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。