Pango-WARNING **:无效的 UTF-8 字符串传递给 GTK C 中的 pango_layout_set_text()
Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text() in GTK C
我在我的 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]='[=11=]';
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,那么它会给出相同的警告并且 window 也会像下面这样调整大小:
正常情况下字体较小,如下所示:
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存储缓慢。
我在我的 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]='[=11=]';
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,那么它会给出相同的警告并且 window 也会像下面这样调整大小:
正常情况下字体较小,如下所示:
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存储缓慢。