Make UTF-8 Environment Comfortable

這篇是我對於 UTF-8 環境的設定心得,其實自己從 FreeBSD 4 就開始嘗試用 UTF-8 的環境了,但是我記得 FreeBSD 4對於 UTF-8 的支援度很差,那時候遇到蠻多問題的,後來還是臣服於 Big5。 到了 FreeBSD 6 支援度已經很好了,便著手建造一個好用的 UTF-8 環境,進展最大的應該算是進 CSCC 之後,和 chenpc & LY 討論了蠻多東西的,最後有這個我自己打 80 分的環境,所以有了這篇 Note。 這篇 Note 重點在於 UTF-8、256 Color & 一些我常用的工具設定,我使用的環境是 FreeBSD 6.3 & 7.0 with tcsh。

Putty Setting

主要是在 Window -> Translation 的設定: Putty Encoding Setting
Encoding 選擇 “UTF-8″,不要勾選 “Treat CJK ambiguous characters as wide” (原因容後說明)。

Locale Setting

主要針對 LC_ALL & LANG 做設定,$HOME/.cshrc 加入:

setenv LC_ALL en_US.UTF-8
setenv LANG en_US.UTF-8

LANG 我沒有設定 “zh_TW.UTF-8″ 的原因主要是避免某些 tool 會看 LANG 開啟一些設定,例如 screen 會看 LANG 開啟 cjkwidth;mutt 也會看 LANG 選擇 charset。但我覺得這些設定可以很明確地在設定檔內指定,讓程式自動偵測反而容易讓人混淆,所以一律用 “en_US.UTF-8″,其它原因容後說明。 LC_ALL 基本上指定了很多東西,像是 LC_MESSAGES 等,這些細部設定可以參考 Handbook 修改。

Screen

Screen 經過許多人的努力,對於 UTF-8 和 Big5 之間的轉換已經很好了,唯一要注意的是,因為 Putty 有支援 256 色,Screen 也加入了 256 色的支援,所以在安裝的時候記得勾選 “XTERM_256″,為什麼要用 256 色?因為我覺得 coding 的時候一定要有一個好用的 Text Editor,尤其是我這種大部份工作都依賴 Console 的 programmer。我用的 Text Editor 是 vim,很剛好地,它支援 256 色,這代表我可以將 Syntax Highlighting 弄得更花俏,Coding 起來也舒適多了不是?
screen options

至於另一個選項 “CJK – Treat CJK ambiguous characters as full width”,可以在 Screen 使用 “cjkwidth on” 來修正某些字的字寬,上 BBS 很有用,但是這必須和 Putty ”Treat CJK ambiguous characters as wide” 這個選項互相搭配才可以作用;但在經過各項測試後,發現在 mutt 中常收到一些廣告信,或是 Title 編碼不一樣的情形,雖然 mutt 也有自動轉換的功能,但是並非所有信件都能處理,尤其是廣告信,如果開啟了 Putty “Treat CJK ambiguous characters as wide” 反而亂得更嚴重,這個問題目前也沒什麼好解法,所以選擇不開啟這個選項;還有另一個原因是 dialog 也會因為邊線字寬的問題亂掉,雖然有 rafan 的 poorman box drawing patch 可以解決,但並沒有進 Screen ports,要自己手動 patch,麻煩了點,不過這並不是主要原因啦!主要還是因為 mutt 的問題沒辦法有個好的解法,所以權宜之下,選擇犧牲掉某些特殊字的字寬 (只是字看起來窄了點)。

Screen 的設定主要如下:

# $HOME/.screenrc
defutf8 on
defc1 off
defencoding utf8

bind b encoding big5 utf8 # Ctrl-a b 轉 Big5
bind u encoding utf8 utf8 # Ctrl-a u 轉 UTF-8

# 256 Color Support
term xterm
termcapinfo xterm "Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm"

# allow bold colors - necessary for some reason
attrcolor b ".I"
attrcolor i "+b"

# erase background with current bg color
defbce on

其實設定和網路上可以找到的差不多,不過要特別說明的是設定中的 term & termcapinfo 名稱要跟環境變數中的 TERM 一樣,這樣才會對應到。在這裡我選擇使用 “xterm” 而不像網路上說的 “xterm-color” 或是 “xterm-256color”,主要是因為在 finch 一個奇怪的問題,如果設了 “xterm-color” 或是 “xterm-256color”,finch 當中的 Alt-C 和 Alt-M 搭配 Up、Down、Right、Left 不能正常運作,所以我後來決定使用 “xterm”,可是實際去看 /usr/local/misc/termcap 後發現其實都對應到同一組設定,這讓我覺得很奇怪,還要再找看看問題出在哪。

成功的話會看到這樣的畫面:
screen - 256 Color

IRC Client – irssi

我常用的 IRC Client 就是 irssi,在新的版本中已經預設加入了 Recode 的支援,也就是說可以針對各個不同的 Channel 或是 Message Window 設定編碼,它有點類似翻譯器,舉個例來說,當我設定了某 Channel 的 Recode 為 Big5,但我預設系統使用的是 UTF-8,那麼 irssi 接收時會將 Channel 中的對話當作 Big5 來轉換成 UTF-8,再輸出到畫面上;反之,你送出到這個 Channel 的訊息也會自動轉換成 Big5 後輸出,這個功能相當重要,尤其是每個 Channel 的編碼是使用者認定的,事實上 IRC Protocol 內部是沒有 Encoding 的設計的,所以決定要使用哪種編碼是由該 Channel 的使用者認定的,因此 IRC Server 上萬”碼”奔騰,所以 Recode 的功能有其必要性。

基本上要實現 irssi 的 UTF-8,網路上已經有相當多的教學文了,需要較詳細的設定可以參考 JeffHung 這篇。我這裡僅針對 UTF-8 的設定說明。進入 irssi 後,可以利用它內建的指令來直接修改設定,好處是不用看較複雜的 config 檔($HOME/.irssi/config),如下設定:

/SET term_charset UTF-8
/SET recode_transliterate ON
/SET recode_fallback UTF-8
/SET recode_out_default_charset UTF-8

當設定完成後,必須將它儲存到 config 內:

/SAVE

然後針對各別的 Channel 或 Message Window 設定編碼,舉例來說:

/RECODE ADD #nctucs Big5
/RECODE ADD #bsdchat UTF-8
/RECODE ADD liuyh Big5

有加上 ‘#’ 代表針對 Channel,沒有的則是 Message Window。同樣地,設定完也要下指令儲存到 config 內。

Vim

Vim 對於 UTF-8 的支援度已經相當地完整了,安裝前記得先把 libiconv 先裝起來,然後再裝 vim-lite 即可有自動轉碼的功能,簡單來說就是以 Big5 格式儲存的文件,打開會自動幫你轉換到 UTF-8 顯示,當然這還要加上一點設定 ($HOME/.vimrc):

" 啟動後是使用 utf-8 編碼
set encoding=utf-8

" 新開的檔案預設是 utf-8 編碼
set fileencoding=utf-8

" 所有可能的檔案編碼
set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1

" 設定輸出到 terminal 的編碼
set termencoding=utf-8

" 將 unicode 中不確定的字符表示成雙字符,在 unicode 下才有用
set ambiwidth=double

有關 encoding, fileencoding, termencoding,我之前有寫過一篇文章來解釋,大家可以參考一下。

上面有提到 Vim 支援 256 色,要顯示出 256 色需要兩個東西配合,一個是設定 Color Level,在 $HOME/.vimrc 加上:

set t_Co=256

如此可以啟動 256 色,接著要使用 256 色的 Color Scheme,上網 google 一下應該可以找到蠻多的,我自己改了一份自己的,將它放在 $HOME/.vim/colors/ 下,接著在 $HOME/.vimrc 加上:

colorscheme yzlin256

這樣便可以了。

Mutt

Mutt 只需要在 $HOME/.muttrc 下設定:

charset-hook ^us-ascii$ utf-8
charset-hook x-unknown utf-8
set allow_ansi
set ascii_chars=yes
set charset="UTF-8"
set locale="UTF-8"
set assumed_charset="utf-8:big5:gb2312"
set send_charset="utf-8:big5:gb2312:us-ascii:iso-8859-1:x-unknown"

這樣應該會正常許多。比較特別要注意的是,如果 Locale 設定 “zh_TW.UTF-8″,然後 Screen 打開 “cjkwidth on”,Putty 也勾選 “Treat CJK ambiguous characters as wide”,Mutt 會在字寬上判斷錯誤,造成畫面亂掉,尤其是許多 Spam Mail 的 Title 會很明顯讓整個字寬判斷錯誤;其實這不該完全歸疚於 Mutt,原罪還是 Mail 的編碼字寬很難去判斷和做適當的轉換。這也是為什麼我偏愛 Locale 設定 “en_US.UTF-8″,不要 CJKWidth 和 Putty 的字寬修正的原因,和 chenpc 經過幾番測試的結果,認為這是目前最好的解法。

Misc

Finch

Finch 本身已經是 Unicode 了,所以不用做額外設定。

rtorrent

rtorrent 在 $HOME/.rtorrent.rc 加上:

encoding_list = UTF-8

這樣檔案目錄和 File List 的顯示會正常很多,我有測試過 rtorrent (0.7.9) 和 rtorrent-devel (0.8.2),rtorrent File List 較正常,只是選取到的名稱每個字會出現兩次;rtorrent-devel File List 則整個亂碼,這個部份可能要等以後的更新了。

lftp

lftp 是我在 Unix-like 系統下常用的 FTP Client Tool,它對檔名的轉碼很好用,只需在 $HOME/.lftp/rc 設定,下面是我常用的設定:

set ftp:charset UTF-8
set file:charset UTF-8
alias big5 set ftp:charset Big5; set file:charset UTF-8
alias utf8 set ftp:charset UTF-8; set file:charset UTF-8

less

在 $HOME/.cshrc 設定環境變數,用 less 看某些 Big5 編碼的東西會正常很多。CS 工作站上的 help 很需要:

setenv LESSCHARDEF "8bcccbcc18b95.."

這樣的 UTF-8 環境已經能應付我 90% 的需求了,如果有錯誤或其他更好的設定方式,也歡迎大家給我意見。

3 Responses to “Make UTF-8 Environment Comfortable”


Leave a Reply