Screen + Unicode-At-On

這一頁主要記錄如何惡搞 screen 讓它可以認得「Unicode 補完計畫」(UAO) 所定義的字元,以便在 BBS 上閱讀/輸入日文。

前言

我經常有使用日文的需求,而破破爛爛、至今歷史超過二十年的 Big5 完全無法滿足我的需求,光是要看到假名就麻煩透頂,更別說是看到日文漢字了!因此很久以前我就把工作環境全面轉移到 zh_TW.UTF-8。因為 X 底下常見的 GUI toolkit 如 GtkQT 等,都早已使用 Unicode 作為內部的編碼方式,所以這個過程算是相當順利。

然而,現在所有的 BBS 還是使用 Big5 作為內部編碼,因此我不得不繼續使用 crxvt 來連 BBS。後來 X 上的 terminal 愈來愈成熟,不但支援 Unicode,還使用 FreeType 畫出漂亮的 anti-alias 字型。加上 screen 有即時轉碼的功能,因此我開始改用 screen + rxvt-unicode。最重要的是 screen 可以隨時切換 big5/utf8,因此我不需要僅為了打逼就另外開一個 X terminal。

雖然看起來很完美,但其實還是有美中不足的地方,那就是日文漢字依然無法顯示。Big5 本身並沒有日文國字,這些字都是由「UNICODE 補完計畫」加進去的。

關於「UNICODE 補完計畫」(UAO)

前因後果我就不細說了,大家自己去看他們的文件吧。UAO 的原理很簡單:改寫 Windows 中的對應表,在原本 Big5 的字碼範圍外定義新的字碼,並對應到日文與簡體中文。一言以蔽之,就是自己造一份新的 Big5。「UNICODE 補完計畫」名稱倒是有誤導之嫌,因為他們補完的不是 Unicode 而是 Big5。

這是個很亂來,但又很有效的做法,諷刺的是,政府機關搞了 CNS11643、搞了 Big5+/Big5e/Big5-2003,知道的人屈指可數,但每天上巴哈姆特的網友中,十個有九個知道裝了 UAO 就可以看到日文。

所以你到底想說啥?

好吧,言歸正傳。因為 UAO 定出的字碼已經成為各大 BBS 上的標準,我當然也希望我打逼的時候可以看得到日文國字,如果還能輸入就更完美了。

而解法其實很簡單,因為 terminal 只負責畫 Unicode,而轉碼都是 screen 自己做的,所以只須要修改 screen 即可。我原本以為只要改 screen 的轉碼表就行了,但因為 UAO 擴大了 Big5 的字碼範圍,所以有些程式碼要小改。

比較難的反而是弄到 UAO 的字碼對應表。雖然找過 UAO 的網站,但他們顯然只提供安裝程式,沒有公開對應表這一頁 有許多不同版本的 Big5 與 Unicode 之間的對應表)。所幸他們的網站給了一個連結,說明 Windows 上的 NLS 檔案格示,因此我從安裝好 UAO 的 Windows 上抓出 C_950.nls,並把對應表解開、轉成 screen 的格式。

以下是完成後的 screenshot:

screen-uao.png

這是我直接從日文網頁複製貼上的結果,如果沒有這個 patch,許多文字都會變成問號。

Patch

因為 UAO 擅自增加了 Big5 的編碼範圍,所以必需要 patch screen,以下是適用於 4.0.3 版的 patch:

轉碼表

Screen 使用自己的轉碼表進行 Big5/Unicode 之間的轉換,為了讓它認得 UAO 定義的新字元,必需使用新的轉碼表。Screen 的轉碼表是個二進位檔案,你可以先下載 conv.plbig5uni.txt 這兩個檔案,然後執行如下指令:

perl conv.pl <big5uni.txt >/usr/share/screen/utf8encodings/18

18 這個檔案正是 screen 用來把 Big5 轉成 unicode 用的轉碼表。

經過 patch、compile 以及更新轉碼表之後,你的 screen 應該可以看到 UAO 所定義的日文漢字了。

注意事項

首先,我不確定我對 screen 的 patch 會有什麼副作用,因此也無法保證使用這個 patch 不會對你的資料造成任何傷害。

其次,雖然我用的 C_950.nls 是 UAO 2.50 的版本,有加入半型日文假名的對應,但目前還無法顯示。

最後建議加上 mhsin 的字寬 patch
mhsin 的字寬 patch 已經被納入 screen 的原始碼1,所以不用再 patch 字寬囉!


rating: 0+x

Comments

Add a New Comment
or Sign in as Wikidot user
(will not be published)
- +
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License