公告版位
我是公告
用 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成為一般人能使用的上逼工具了吧。

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

留言列表 (15)

發表留言
  • ronny
  • 這邊有拉飯長輩寫的note
    還不錯用
    http://rafan.infor.org/wiki/index.cgi?utf8note

    仔細想想, 雙色字問題應該算是無解吧....
    BBS的資料先透過luit被 big5->utf8
    再從utf8傳回到putty
    putty又要從utf8轉成big5再組合起來分開配色
    超級麻煩啊....
  • llwang
  • 如果以後 BBS 都改用 UTF-8 的話,
    會不會出現傳說中的六色字呢?
    XD
  • llwang
  • 啊,不小心就留了三次了,
    不知道為什麼貼成功了還一直看到 invalid authorization code
    於是我就以為是貼失敗了
  • ronny
  • 唉唉..不知道啥時才會改成utf-8啊..
    (我把comment那邊程式改了一下, 不知道現在ok了沒)
  • poker card game
  • <strong>poker card game</strong>

    Human law is law only by virtue of its accordance with right reason, and by this means it is clear that it flows from Eternal law. In so far as it deviates from right reason it is called an Unjust law
  • rafan
  • PuTTY 0.58 includes CJK width patch, thanks piaip ;p
  • 榮尼王
  • 偉哉 piaip!
    現在已經不用使用自己編的PuTTY了
  • Gea-Suan Lin&amp;#8217;s BLOG &amp;raquo; 複雜的 UTF-8 世界
  • [...]
  • JeffHung.Blog&amp;raquo;Blog Archive
 &amp;raquo; 建構 UTF-8 的 UNIX 環境
  • [...] ngual 的世界。 (追蹤收集資料用,將不定期更新) 複雜的 UTF-8 世界 解決用putty看全形字會變一半的問題了!! 換到UTF-8環境 mutt中的亂碼信 看
  • Jackie
  • 感謝...
    如此一來BBS可以說幾乎都沒有問題了(還是有小地方會壞掉^^")
    這樣終於可以在全UTF-8的環境下工作了^^
  • 建構 UTF-8 的 UNIX 環境 [JeffHung.Blog]
  • [...] 解決用putty看全形字會變一半的問題了!! [...]