用 putty+screen+utf8 時,會有一個很嚴重的問題,就是很多特殊符號在 utf8 的設定是 halfwidth,也就是他只會顯示一半的寬度,像是big5裡面的全形框線,轉成utf8後就變成halfwidth了,在putty中就會變非常醜。


以下是KKMan看Ptt2進站畫面
kkmanptt

以下是PuTTY看Ptt2進站畫面
puttyptt
(因為Ptt1現在進站畫面有用到很多雙色字,雙色字在PuTTY上仍無法正常顯示,所以還是很醜,我先用沒用雙色字的Ptt2進站畫面吧)

之所以會變這麼醜,主要原因就是很多特殊符號在UTF8中設定是halfwidth,因此那些特殊符號都只顯示一半而已。剛剛十一點多想把這個問題解決,一直到現在五點多終於解決了,我就把解決法貼出來吧。


1. 修改 PuTTY 的程式碼,讓PuTTY在遇到 half width 的字時仍然用2bytes的長度印出,簡單修改法是將 terminal.c 中的
if ( !width )
width = wcwidth((char_t) c );
這兩行改成
if ( !width )
width = wcwidth_cjk((char_t)c );
(其實PuTTY原來就有給CJK(Chinese, Japan, Korea)使用2bytes長度印出的功能,只是因為這功能只有CJK人會用到,所以PuTTY就沒有開這功能了,但是函式已經寫在裡面。)
如果嫌麻煩不想自己編新的PuTTY,我自己有編好一個,用 VC++.NET 2003編的。
putty.exe
我這個版本的putty在Setting=>Window=>Translation=>character中有多加一項 "UTF-8(CJK)"
要正常顯示就選這一個吧。

2. PuTTY沒問題了,但是screen部分有問題,screen也是為了CJK,他會把 half width的字後面加一個空白,讓half width的字變成2bytes的長度,但是只有左半邊有東西,右半邊沒字。
解決法也很簡單,修改 encoding.c

修改 utf8_isdouble 函式並增加一個 isb5full 函式 (以下方法是從 http://fractal.csie.org/~eric/utf8note/偷來)
int
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) ;
}讓他會把utf8中的特殊符號當作double word看,這樣子就ok了。

然後下載 http://linux.nctu.edu.tw/~yjchou/work/screen/18
並把這檔案覆蓋掉 screen 的 /usr/local/share/utf8decodings/18 這個檔案
這樣子顯示出來的就很完美了

修改之後
Ptt2的進站畫面變成
puttyptt2


就這樣啦....
接下來還有雙色字問題,解決了的話,PuTTY應該可以幹掉kkman和PCMan成為一般人能使用的上逼工具了吧。

全站熱搜

發表在 痞客邦 留言(15) 人氣()