Related links: Main Page Fontconfig FAQ
XFree86 4.3.0 最近 release 了。由於貪圖美麗的畫面,便順手裝了起來。Unofficial 的 Debian packages 可以由 apt 取得:
deb http://people.debian.org/~mmagallo/packages/xfree86/i386/ ./
升級上去之後目前都沒有遇到問題。順便附送的是新的 Xcursor library, 螢幕上出現了 半透明有陰影的滑鼠游標。
XFree86 4.3.0 裡頭的 FreeType2 升級到了 2.1.1, Xft Library 也有了很大的改變, 主要是獨立出 fontconfig, 讓各個 toolkit/app 只要使用 fontconfig 就可以擁有統一化以及中心化的字型設定,同時也允許 toolkit/app 再額外自己去 match 字型,甚至仍舊使用該程式自己的設定。 Fontconfig 只是給定一個選擇字型的參考,讓程式可以藉由 fontconfig 來輕易 match 到一個字型使得 Xft 可以接受該 render 的請求。以 Debian 為例, gtk 2.2, libqt3, mlterm-cvs, mozilla-cvs 都已經支援了 fontconfig, 假以時日當更多的程式都使用 fontconfig, 字型的安裝以及設定將會是一勞永逸的工作。安裝方面 十分簡單,設定則可以針對個別的字型微調到滿意為止。Kudos to Keith Packard.
前陣子當程式陸陸續續支援了 fontconfig 之後許多原先的 Xft1 設定便無效了,導致 字變得蠻不好看。所幸大部分工作都是在 terminal 裡完成, 影響並不大。藉著升級上來 的機會花了幾天時間設定好了新的 fontconfig, 把許多東西翻修一番,並且把 terminal 由舊的 aterm 換成 UTF-8 的 mlterm, 事情比想像中的複雜。
參照小光光學長的文章
來設定一個 app-transparent 的 Big5 <-> UTF-8 terminal. 該文章和其中 reference
到 yjchou 的 screen
with utf8 都提到當透過 screen 把原先 Big5 的輸出轉為 UTF-8 時,
對於許多符號的輸出與轉換會出現慘不忍睹的情況。稍微找了一下原因,發現問題出在相當多的環節, 錯也不在任何一個地方。但在 Big5
尚未成為非主流之前,也只能想辦法讓這問題得到暫解。

screen 有個 Big5 和 UTF-8 的對應表,裡面把每一個 Big5 -> UTF-8 作對應。screen 可以把 Big5 轉出成 UTF-8 給 UTF8-capable 的 terminal, 而從 terminal 餵進 Unicode 字元也會嘗試 被 map 回 Big5, 若遇到對應不到的情況則輸出問號。我們必須為每個 Big5 的字都找到 對應的 Unicode, 否則當我們使用到未對應到的字元時就會發生轉不出來的情形。 舉例來說,如
○ ● △ ▲ ◎ ☆ ★ ◇ ◆ □ ■ ▽ ▼
這些會出問題的符號,只能夠對應到 Unicode 中的 0x25** 和 0x26** (參照 http://www.unicode.org/charts/
的 Box Drawing,Block Elements,
和 Geometric
Shapes 等等)。 看起來沒有什麼問題,但這些符號是 half width 還是 full width, 各家都沒有一致的說法; 以
Big5 來說,所有的 Big5 都是 full width (wide char), 所以 Big5 ASCII Art 都是在
這標準下畫出來的。就我手上有做 CJK Planes 的 Unicode TTF 來說,MSung Light TC (StarOffice
附的), PMingLiU (Windows), SimSun (Windows), SimHei (Windows), Bitstream
Cyberbit (Bitstream/Netscape), Arphic TTF (GPL'ed) 都是作成 full width. 而
Arial Unicode MS (Windows), Andale Sans UI (StarOffice), Andale WT UI
(StarOffice) 以及所有其他沒有做 CJK 的 Unicode TTF 都是作成 half width. 有 CJK 的字形需要
這些符號,而我們也習慣於它們是 full width. 沒有 CJK 的字型自然也沒有理由把它們當成 full width 來用。這些符號在
Unicode 中不是 CJK 專屬的,是大家共用的。這在一般軟體 (如文書處理軟體) 當中不會有問題,因為這些軟體本來就允許
variable width 的字。 但在 terminal 下,尤其是許多憑藉這些字元的固定寬度的環境之中,就必須有明確的定義。

目前手邊支援 UTF-8 顯示的 terminal 大致有 gnome-terminal 與 mlterm, 其中 gnome-terminal 和 mlterm 對於 variable width 的文字處理方式不同,gnome-terminal 在一些方面還有問題,而 mlterm 需要設定:
encoding = UTF-8
use_multi_column_char = true
col_size_of_width_a=1 (???)
not_use_unicode_font=true
#only_use_unicode_font=false (mlterm/aafont: ISO10646_UCS4_1_BIWIDTH=simhei-iso10646-1;)
use_variable_column_width = false
其中 col_size_of_width_a 根據文件中的說法是 Specify number of columns of Unicode characters with EastAsianAmbiguous property. 實際上看 cvs source code 的結果卻似乎沒有發現這個選項實質上在哪邊作用。很奇怪。設了和不設也沒有什麼差別。
not_use_unicode_font=true 的原因是我希望 mlterm 能夠把不同 encoding 的字分給不同 font 顯示,因為 fixed width 又有中文字的 TTF 通常 ISO8859-1 的字都不甚好看。自然設成了 false 就會只用 ISO10646_UCS*(_BIWIDTH) 的字型來顯示。(BIWIDTH 所設定的是寬字元所用的字型。在某種程度上還是可以分開設。) 值得注意的是 not_use_unicode_font 和 only_use_unicode_font 不能同時被設定。
ISO8859_1=Luxi Mono-iso10646-1;
BIG5=SimHei-iso10646-1;
GB2312_80=SimHei-iso10646-1;
JISX0208_1978=Kochi Gothic-iso10646-1;
JISX0208_1983=Kochi Gothic-iso10646-1;
JISX0208_1990=Kochi Gothic-iso10646-1;
Luxi Mono 是最近的 XFree86 版本就有附上的字型。Kochi Gothic 是用來顯示日文假名的 free TTF, 品質很高, 在 Debian 中是作成了 ttf-kochi-* 的套件。SimHei 是從 Windows 來的 simhei.ttf. Windows 另一套 Arial Unicode MS (arialuni.ttf) 擁有很大的 Unicode Coverage, 品質也很好,但上述所謂 Big5 和 Unicode 共享的特殊符號 以及 box drawing 符號則是作成半形的,這在顯示 Big5 Art 會變成只有一半的寬度,所以沒有使用。
int不知道為何 screen 獨鍾 0x300a "《" 和 0x300b "》" 等。但經過這樣的修改,顯示這些特殊符號時就會很正常。
utf8_isdouble(c)
int c;
{
return
(c >= 0x1100 &&
(c <= 0x115f || /* Hangul Jamo init. consonants */
(c >= 0x2e80 && c <= 0xa4cf && (c & ~0x0011) != 0x300a &&
c != 0x303f) || /* CJK ... Yi */
(c >= 0xac00 && c <= 0xd7a3) || /* Hangul Syllables */
(c >= 0xf900 && c <= 0xfaff) || /* CJK Compatibility Ideographs */
(c >= 0xfe30 && c <= 0xfe6f) || /* CJK Compatibility Forms */
(c >= 0xff00 && c <= 0xff5f) || /* Fullwidth Forms */
(c >= 0xffe0 && c <= 0xffe6) ||
(c >= 0x20000 && c <= 0x2ffff))) || isb5full(c);
}
int
isb5full(c)
int c;
{
return
(c >= 0x00a7 && c <= 0x00f7) ||
(c >= 0x02c7 && c <= 0x02d9) ||
(c >= 0x0391 && c <= 0x03c9) ||
(c >= 0x2013 && c <= 0x2642) ||
(c == 0x300a || c == 0x300b) ;
}


XFree86 4.3 已經讓 xterm 在啟動的時候自動去執行 luit 做轉碼的工作。不過我不知道該如何設定 xterm 去分辨
double width 和 single width. luit 是一個有趣的轉碼程式,它不會像 screen 一樣
在轉過來的途中附加一個空白,所以 Big5 特殊符號從 Big5 -> UTF-8 很正常。若是不用 xterm, 可以在指定的
locale 環境下面單獨執行 luit. luit 沒有假名對應。對於一般使用是沒有什麼問題。
yiyantang 也是一個有趣的轉碼終端機,它是用 libhz 來做轉碼的工作,還有自動判斷簡體/繁體編碼 來做轉換的功能。可以在
Big5 <-> GB <-> UTF-8 <-> hanzi 等等之間自由互轉。也可以把輸入的文字
轉成所需要的編碼,意思是可以藉由一個非 UTF-8 的 terminal, 與一個 zh_TW.Big5 的 xcin 來輸入 UTF-8
的文字。它的假名對應也是錯的,其他許多地方的對應也有點奇怪,不過只要藉由修改 libhz (zh-autoconvert) 的 source
code 中的 table 就能解決了,我暫時沒去動它。

無論用那種方式轉碼,畢竟只是權宜之計。例如 Big5 中有一區希臘字母是全形符號。當有天 terminal 中顯示出了一些希臘字母的編碼,用 screen 轉出來成為 Big5 便會全部變成全形字,這自然非我們所期盼的結果。由於 Unicode 裡面就那麼一區是 Greek Letters, 並沒有定義所謂全形希臘字區,只要繼續使用 Big5, 這種問題永遠不能夠解決。長遠來說,還是要使用統一的編碼,才可能同時使用各種不同語言的文字。
請指正。
Fatal error: Call to undefined function mysql_pconnect() in /home/eric/public_html/utf8note/db_connect.php on line 2