歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

基於freetype/fontconfig/xft的漢化美化方

  本文簡要介紹了基於gtk1、gtk2和qt的程序漢化的基本概念,並詳細介紹了用freetype/fontconfig/xft對Slackware 9.1進行漢化和美化的具體步驟。 多謝Xoo兄的詳細解決辦法! 寫在前面: 每一個剛剛把Linux裝上的朋友面對的第一個問題就是漢化,美化。linux默認的字體實在是不怎麼漂亮,特別是對中文更是如此。我開始用了兩三個月美化一直不是很好,正在心灰意懶,准備滾回Windowz的時候,偶然看到一篇美化的文章,照著做了而且竟然成功了(至少是我想要的效果),從那以後就慢慢的愛上了linux直到把Windowz徹底仍進廁所。 網上關於美化的文章其實已經很多了,但大多是告訴你第一步如何如何,第二步如何如何,至於其中的簡單道理很少有涉及。結果造成知其然不知其所以然,一旦照著文章做下來沒有成功,那就等於白做了。以後遇到問題,還是束手無策。 我寫這個的目的就是希望結合我自己實際中遇到的種種情況,結合我自己的經驗,寫一篇文章幫助那些既想美化成功,而又想大概知道"為什麼要這麼做"的朋友。當然我只是能講一些我自己所理解的很淺顯的道理,更高深的道理我是不懂的,呵呵。有說錯的地方還請大家多多指教。本文所介紹的是基於 freetype/Fontconfig/Xft的,xtt我沒用,使用的字體都是TrueType。 下面我們開始。 強烈建議你把下面這段仔細看一下,這樣對接下來的具體操作有很大幫助!! linux下常見的GUI程序有三種,GTK1、GTK2和QT,基於這三種圖形庫的程序在美化上是有不同要求的。XFree86下常用的字體繪制方案有xtt,freetype/Fontconfig/Xft。下面分別來看看 1.GTK1的程序是不支持Fontconfig的。所以有點麻煩。拿到一個字體,你首先要讓X找到它對吧?這一步就是在 /etc/X11/XF86config的Section "files"段裡面的Fontpath屬性裡說明的詳細後面會講。好了,X現在知道字體在哪裡了。那gtk1的程序還不能直接使用它們,因為我們還沒有給它們"注冊",這就需要在前面設定的Fontpath裡生成兩個文件fonts.dir fonts.scale這兩個文件裡有Fontpath下所有字體的列表信息,就是一個"索引"。有了這個"索引",gtk1的程序就可以找到相應的字體了。生成這兩個文件的工具有mkfontdir,mkfontscale,ttmkfdir等等。好了,上面兩步如果正確完成了,你的gtk1程序現在就可以正常顯示漢字了。 常見的gtk1程序有xmms,gimp..... 2.GTK2和QT程序可以使用Fontconfig。Fontconfig是一個把字體選擇出來,並且決定怎麼顯示這些字體的東東。類似於前面提到的 XF86config裡的Fontpath屬性以及fonts.dir和fonts.scale的功能,就是讓程序找到這些字體。所以,對於GTK2和 QT程序XF86config和fonts.dir就沒有用了。所以對於這類程序來說,主要的配置文件是/etc/fonts/fonts.conf。 Fontconfig的高級功能有很多,詳細的說明可以參考這裡: http://www.linuxfans.org/nuke/modules.PHP?name=Forums&file=viewtopic&t=48331 GTK2和QT的程序就很多了,KDE,GNOME,Firebird............ 上面的兩段提到的只是讓程序找到字體,並不負責具體的顯示工作。它們只能保證你的程序能找到字體不會出現亂碼現象,也就是所謂的"漢化" 至於freetype/Xft或者xtt是什麼?我的理解它們是負責具體把字體顯示到屏幕上的東西,決定了你看到的字體是個什麼效果。著名的"firefly美化包"就做了很多改善中文顯示效果的工作。也就是所謂的"美化" 到此你應該對漢化,美化有了一個大概的概念。接下來就是具體的操作 具體在Slackware 9.1上實現freetype/fontconfig/xft漢化美化工作 我用的是Slackware 9.1,但是對其它發行版,美化漢化的原理都是大同小異的。看了文章再通過實踐加以理解,應該能夠靈活應用其它發行版上的。 以下命令以#開頭表示是以root身份操作,$開頭則是以普通用戶身份操作。 Step1. 准備TrueType字體,常用的如simsun.ttf tahoma.ttf verdana.ttf等等。然後決定你要把字體放在哪個目錄裡。這個目錄隨你喜歡,我把它們放在/usr/X11R6/lib/X11/fonts/TTF/裡。 比如你下載來的的ttf字體都在/home/username/myfonts/下面,就做如下操作 #cp /home/username/myfonts/*.ttf /usr/X11R6/lib/X11/fonts/TTF/ Step2. 讓GTK1程序找到你剛才放進去的字體。上面說的方法你還沒有忘吧?讓我們先修改XF86config #vi /etc/X11/XF86config 找到 Section "Files" ................. 這一段,在裡面加上一個Fontpath屬性


FontPath "/usr/X11R6/lib/X11/fonts/TTF/" 當然,如果裡面已經有了你放字體的路徑就不用加了,如果你的路徑和我不一樣,那就寫你的路徑,你也可以隨時添加自己的字體路徑,道理都一樣。 如果你在XF86config裡發現了 Load "xtt"這行,把它注釋掉。我是不用xtt的 接下來當然是准備fonts.dir 和fonts.scale了。生成這兩個的文件工具前面說了。Slackware自帶的是mkfontdir和mkfontscale,我個人強烈不推薦這兩個工具,它們生成的fonts.dir很不爽,simsun.ttf裡找不出gbk的encoding。你可以去下載一個叫ttmkfdir的工具: FTP://216.254.0.38/linux/rawhide/1.0/i386/Fedora/RPMS/ttmkfdir-3.0.9-7.i386.rpm 假設你已經裝上了這個工具,就做如下操作 #ttmkfdir /usr/X11R6/lib/X11/fonts/TTF/ -o /usr/X11R6/lib/X11/fonts/TTF/fonts.scale 現在檢查一下這個文件 #vi /usr/X11R6/lib/X11/fonts/TTF/fonts.scale 如果裡面有 :1:simsun.ttfxxxxxxxxxxxxxxxxxxxx 這樣以 :1:開頭的行,把它們都刪掉,freetype不需要這個東西,而且可能會導致一些問題。特別再注意一下是不是生成了 simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0 simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-gbk-0 這兩行,因為encoding是很重要的,mkfontdir生成的fonts.dir很可能沒有-gbk-0的編碼,這樣也會導致一些問題。所以我用 ttmkfdir 確保無誤後 #cp /usr/X11R6/lib/X11/fonts/TTF/fonts.scale /usr/X11R6/lib/X11/fonts/TTF/fonts.dir (這兩個文件其實是一樣的) 你的gtk1程序已經可以使用字體了,但是在gtk1程序裡當然還要指定你究竟要使用什麼字體。對gtk1程序使用什麼字體有一個全局配置文件/etc/gtk/gtkrc.zh_CN 把我的配置文件貼一下 # This file defines the fontsets for Chinese language (zh) using # the simplified chinese standard GuoBiao as in mainland China (CN) # # 1999, Pablo Saratxaga <[email protected]> # style "gtk-default-zh-cn" { fontset = "-*-bitstream vera sans-medium-r-normal-*-*-120-*-*-p-*-microsoft-cp1252,\ -*-simsun-medium-r-normal-*-12-*-*-*-*-*-gbk-0" } class "GtkWidget" style "gtk-default-zh-cn" 這個文件告訴程序,對於英文字體優先使用bitstream vera sans字體,對於中文由於bitstream vera sans沒有中文字體,就使用後面的simsun字體。 至此,gtk1程序的漢化全部完成。 現在可以startx 運行一個xmms看看,界面如何?至於xmms列表顯示中文可以搜索其它文章。也很簡單 補充幾點技巧和說明: 1. -*-bitstream vera sans-medium-r-normal-*-*-120-*-*-p-*-microsoft-cp1252 這種字體表示方法是不是很復雜?有個小技巧幫你選擇自己想要的字體,/usr/X11R6/bin/下有一個程序xfontsel ,運行它。自己擺弄一下你就明白了。在這裡你可以看到gtk1程序所能找到的ttf字體,有一些就是從你剛才生成的fonts.dir裡讀出來的。通過它你還可以得到你需要的字體的正確表達格式。 2.Slackware 9.1有了bitstream vera sans 等一系列優秀的ttf字體。它們默認也的都在/usr/X11R6/lib/X11/fonts/TTF/目錄下,那些Veraxx.ttf的字體都是。可是那個目錄下的fonts.dir沒有把它們列進去。如果你前面都是按照我的方法做了,剛才那步ttmkfdir已經把它們收錄進去了。如果你剛才操作的是別的目錄,那就在這個/usr/X11R6/lib/X11/fonts/TTF下ttmkfdir 一次了,方法和前面的一樣。 3.ttmkfdir生成的fonts.dir 和fonts.scale可能會有一些多余的編碼,比如那些以ascii-0和adobe standard-0結束的行,在我這裡引起了一些問題,如果你覺得有什麼異常,先把這樣的行都刪掉。 Step3 搞定gtk2和QT程序。 基於fontconfig選擇字體的程序就容易配置多,fontconfig也提供了一些更高級的功能。 類似gtk1,現讓這些程序找到這些字體。前面已經說過XF86config裡的Fontpath和fonts.dir文件已經沒有必要了。fontconfig的核心配置文件是/etc/fonts/fonts.conf用vi打開這個文件

開始就有這麼一段 <!-- Font Directory list configured on Wed Apr 23 11:40:17 CST 2003 --> <dir>/usr/X11R6/lib/X11/fonts</dir> <dir>~/.fonts</dir> <dir>/usr/share/fonts</dir> 這段是告訴fontconfig去這些目錄包括它們的子目錄裡面去找字體。是不是比Fontpath和fonts.dir省事多了? 你要做的就是把你放字體的路徑加上,我剛才放自己的路徑已經被包括在裡面了。所以不用修改它。 運行 #fc-cache 更新字體信息。 好了,現在gtk2和qt的程序就可以使用你添加的字體了,太簡單了吧?而且對fonts.conf的修改馬上就可以生效。不像gtk1程序修改gtkrc後還要重新運行,修改XF86config甚至還要restart X等等。 類似gtk1程序,gtk2和qt程序都有一個全局字體配置。 gtk2程序的全局配置文件是/etc/gtk-2.0/gtkrc 也把我的內容貼上來 style "user-font" { font_name="Bitstream Vera Sans 9" } class "*" style "user-font" 是告訴程序使用Bitstream Vera Sans ,字體大小是 9 qt程序的默認字體配置 $/usr/lib/qt-3.2.1/bin/qtconfig 出來一個圖形界面,在裡面就可以方便選擇你要的字體了 補充幾點技巧和說明: 1.剛才提到的xfontsel可以幫你查看gtk1可用的字體,那麼fontconfig究竟找到了哪些字體呢?也有一個程序叫fc-list,默認在 /usr/X11R6/bin/下面,運行它,會顯示一個列表。裡面的字體名稱就是可以使用的字體。比如我剛才的gtk2配置文件的字體名字就在裡面。 2./etc/fonts/fonts.conf的強大的功能有很多,其實也很復雜。詳細的設置可參考本文開頭給出的文章連接。 3.你應該會發現。比如在kde控制中心裡選擇字體的時候,你可以選擇所有字體都是Tahoma,Vera sans什麼的,我的gtkrc裡寫的也是一個英文字體,這樣英文字體看起來很pp,而中文字體又是如何決定的呢?為什麼我選擇了英文字體而中文字體還能正常顯示呢?這就是fontconfig的功勞,在我的fonts.config裡有這麼兩段: <!-- Sans-serif faces --> <alias> <family>Bitstream Vera Sans</family> <family>Tahoma</family> <family>Verdana</family> <family>Arial</family> <family>Helvetica</family> <family>Nimbus Sans L</family> <family>Luxi Sans</family> <family>Kochi Gothic</family> <family>AR PL KaitiM GB</family> <family>AR PL KaitiM Big5</family> <family>Baekmuk Dotum</family> <family>SimSun</family> <default><family>sans-serif</family></default> </alias> 和 <alias> <family>sans-serif</family> <prefer> <family>Bitstream Vera Sans</family> <family>Tahoma</family> <family>Verdana</family> <family>Arial</family> <family>Helvetica</family> <family>Nimbus Sans L</family> <family>Luxi Sans</family> <family>Kochi Gothic</family> <family>AR PL KaitiM GB</family> <family>AR PL KaitiM Big5</family> <family>Baekmuk Dotum</family> <family>SimSun</family> </prefer> </alias> 這段告訴程序,遇到要顯示sans-serif的字體,優先使用列表裡在前面的字體,這裡就是Bitstream Vera Sans,如果該字體不能顯示需要的字符就繼續在下面找,對於中文,就找到最後的SimSun(宋體)了。你如果想用其它默認的中文,就可以把你需要的中文字體摞在<family>SimSun</family>上面。就優先使用你要的字體了。

到此為止,其實漢化已經結束了,如果你覺得這個效果還不錯,那就此打住吧。如果你覺得還有些不完美,如中文細節顯示的還不是很好,那就可以求助於firefly的美化包 安裝這些包就很簡單了,我簡要說一下這些包的功能。 fontconfig-2.2.1-i486-1.Firefly.tgz 會替換你現在的/etc/fonts/fonts.conf,加上了一些firefly修改的屬性。 freetype-2.1.5-i486-1.Firefly.tgz xft-2.1.2-i486-1.Firefly.tgz 這兩個是字體繪制的核心部分,裝上他們可以使中文顯示的更完美,具體的原理我就不懂了,呵呵,也沒功夫去研究。 xfree86-4.3.0-i486-5.Firefly.tgz也能改善字體顯示效果,我這裡不裝它,任務欄和標題欄的中文粗體顯示不出來。如果你網絡不是很好,這個包也挺大,你可以不裝它,沒什麼大礙。 qt-3.2.1-i486-1.Firefly.tgz 這個包裝不裝無所謂,還挺大的.我覺得除了讓你的qt程序選擇字體的時候可以顯示一個中文字體名(SimSun顯示為"宋體")以外沒什麼更有價值的功能,可以不裝。 以上幾步都做完了,如果不出意外的話,你gtk2和qt程序顯示的英文是又粗又黑的,看起來就像用了粗體一樣。如果你覺得這樣挺好那就罷了。如果你和我一樣,覺得髒兮兮的很難看,可以在你的/etc/fonts/fons.conf上加上這麼一段 <!-- This eXPression is added by Akito Hirai<[email protected]> for convenience. It can be used to make artificial bold versions in client libraries/applications. --> <match target="font"> <test name="weight"> <const>medium</const> </test> <test target="pattern" name="weight" compare="more"> <const>medium</const> </test> <edit name="weight" mode="assign"> <if> <more> <name>spacing</name> <const>proportional</const> </more> <const>demibold</const> <const>bold</const> </if> </edit> </match> <match target="font"> <test name="pixelsize" compare="less_eq"> <double>16</double> </test> <test name="pixelsize" compare="more_eq"> <double>8</double> </test> <edit name="antialias" mode="assign"> <bool>f</bool> </edit> </match> 這樣一來,Tahoma,Verdana,等Windowz下幾個主要的ttf字體效果就和Windows下沒什麼區別了。不過對於Bitstream Vera Sans來說似乎有點"少肉",但總體來說效果是不錯的,請選擇使用。 補充一點,對於GTK2的程序,一般也沒有必要改/etc/fonts/fonts.conf 如英文用Tahoma,中文用SimSun 可以直接在/etc/gtk-2.0/gtkrc裡改成 style "default" { font_name="Tahoma,SimSun 9" } widget_class "*" style "default" Stern des Südens



--> <match target="font"> <test name="weight"> <const>medium</const> </test> <test target="pattern" name="weight" compare="more"> <const>medium</const> </test> <edit name="weight" mode="assign"> <if> <more> <name>spacing</name> <const>proportional</const> </more> <const>demibold</const> <const>bold</const> </if> </edit> </match> <match target="font"> <test name="pixelsize" compare="less_eq"> <double>16</double> </test> <test name="pixelsize" compare="more_eq"> <double>8</double> </test> <edit name="antialias" mode="assign"> <bool>f</bool> </edit> </match> 這樣一來,Tahoma,Verdana,等Windowz下幾個主要的ttf字體效果就和Windows下沒什麼區別了。不過對於Bitstream Vera Sans來說似乎有點"少肉",但總體來說效果是不錯的,請選擇使用。 補充一點,對於GTK2的程序,一般也沒有必要改/etc/fonts/fonts.conf 如英文用Tahoma,中文用SimSun 可以直接在/etc/gtk-2.0/gtkrc裡改成 style "default" { font_name="Tahoma,SimSun 9" } widget_class "*" style "default" Stern des Südens



<match target="font"> <test name="weight"> <const>medium</const> </test> <test target="pattern" name="weight" compare="more"> <const>medium</const> </test> <edit name="weight" mode="assign"> <if> <more> <name>spacing</name> <const>proportional</const> </more> <const>demibold</const> <const>bold</const> </if> </edit> </match> <match target="font"> <test name="pixelsize" compare="less_eq"> <double>16</double> </test> <test name="pixelsize" compare="more_eq"> <double>8</double> </test> <edit name="antialias" mode="assign"> <bool>f</bool> </edit> </match> 這樣一來,Tahoma,Verdana,等Windowz下幾個主要的ttf字體效果就和Windows下沒什麼區別了。不過對於Bitstream Vera Sans來說似乎有點"少肉",但總體來說效果是不錯的,請選擇使用。 補充一點,對於GTK2的程序,一般也沒有必要改/etc/fonts/fonts.conf 如英文用Tahoma,中文用SimSun 可以直接在/etc/gtk-2.0/gtkrc裡改成 style "default" { font_name="Tahoma,SimSun 9" } widget_class "*" style "default" Stern des Südens



Copyright © Linux教程網 All Rights Reserved