Windows下GTK中文显示问题

人算不如天算,竟然要在Python+GTK和VB.net之前选择了。

这里下载了PYGTK整合包安装完成后,发现运行后中文显示很丑陋,同时日志中显示如下信息:

PangoWarning: couldn't load font "瀹嬩綋 Not-Rotated 9", falling back to "Sans Not-Rotated 9", expect ugly output.

PangoWarning: couldn't load font "瀹嬩綋 9", falling back to "Sans 9", expect ugly output.

PangoWarning: couldn't load font "宋体 Not-Rotated 9", falling back to "Sans Not-Rotated 9", expect ugly output.

显然,上面的乱码应该是“宋体”,但没能正确识别。

解决办法是在etc\gtk-2.0\目录下新建一个gtkrc.zh_CN文件,其内容可以从gtkrc中复制一部分,再增加汉字使用的指定:

gtk-theme-name = "MS-Windows" gtk-icon-theme-name = "Tango" gtk-fallback-icon-theme = "hicolor" gtk-alternative-button-order = 1 gtk-alternative-sort-arrows = 1 gtk-auto-mnemonics = 1 gtk-show-input-method-menu = 0 gtk-show-unicode-menu = 0

style "user-font" {
  font_name = "SimSun 10"
}

widget_class "*" style "user-font"

gtk-font-name="SimSun 10"

有人说建立gtkrc.zh_CN后的设置无效,那多半是环境中的本地化设置有问题,这样的话直接修改gtkrc文件即可。

设置完,中文显示正常了。但程序运行后还日志中还是有这样的警告:

PangoWarning: couldn't load font "宋体 Not-Rotated 9", falling back to "Sans Not-Rotated 9", expect ugly output.

于是尝试修改etc\pango\pango.aliases文件,增加一行:

"宋体"   = "宋体,simsun,simhei,consolas,courier new"

但很遗憾,警告还是存在。

再次尝试,在gtkrc中增加

widget "*" style "user-font"

但,结果变成了:

PangoWarning: couldn't load font "SimSun Italic Not-Rotated 10", falling back to "Sans Italic Not-Rotated 10", expect ugly output.

显然还是在找"SimSun"即“宋体”的斜体字库失败。中文字库均没有斜体字的概念,一般都是“伪斜体”。

看来这个问题暂时没法解决了。不过这个警告并不影响中文的正常显示。

另,缺省的pango.aliases设置中,mingliu都是在simsun前,这样导致一些地方汉字显示为繁体中文,需要把simsun放到mingliu前。

最后,让我们转换一下思路,既然汉字没有Italic type只有Oblique type的概念,为什么我们非得用斜体汉字库,斜体就用英文的字库,汉字就用汉字的字库。我们可以充分利用pango中的定义。

于是尝试修改gtkrc中的

style "user-font" {
  font_name = "SimSun 10"
}

style "user-font" {
  font_name = "serif 10"
}

果然,警告消失,中文显示正常。注意,pango.alias中的serif字体系列中simsun要已放在mingliu前。

至此,问题得到全部的解决。

需要调整的文件两个,其中etc\gtk-2.0\gtkrc.zh_CN内容为:

gtk-theme-name = "MS-Windows"
gtk-icon-theme-name = "Tango"
gtk-fallback-icon-theme = "hicolor"
gtk-alternative-button-order = 1
gtk-alternative-sort-arrows = 1
gtk-auto-mnemonics = 1
gtk-show-input-method-menu = 0
gtk-show-unicode-menu = 0


style "user-font" {
  font_name = "serif 10"
}

widget_class "*" style "user-font"
widget "*" style "user-font"

gtk-font-name="SimSun 10"

另一个是etc\pango\pango.aliases,其内容为:

courier    = "courier new,courier monothai"
mono       = "consolas,courier new,lucida console,courier monothai,simsun,mingliu,gulimche,ms gothic,kartika,latha,mangal,raavi"
monospace  = "consolas,courier new,lucida console,courier monothai,simsun,mingliu,gulimche,ms gothic,kartika,latha,mangal,raavi"
sans       = "arial,lucida sans unicode,browallia new,simhei,mingliu,gulimche,ms gothic,kartika,latha,mangal,raavi"
"segoe ui" = "segoe ui,meiryo,malgun gothic,microsoft jhenghei,microsoft yahei,gisha,leelawadee"
serif      = "times new roman,angsana new,simsun,mingliu,gulimche,ms gothic,kartika,latha,mangal,raavi"
tahoma     = "tahoma,lucida sans unicode,browallia new,simhei,mingliu,gulimche,ms gothic,kartika,latha,mangal,raavi"
"myfonts"   = "simsun,simhei,consolas,courier new"
"宋体"   = "宋体,simsun,simhei,consolas,courier new"

标签: windows, gtk, chinese, font, 汉字, 字体, pango.aliases, gtkrc

添加新评论