會影響中文正確的程式很多, 這邊以我自己遇到的程式來說明:
- 終端機
- vim
- git/hg diff
我用的是 mate-terminal, 支援 utf8/big5 模式, 你一定猜想, 要正確看 windows/big5 檔案, 應該會需要切換到 big5 編碼吧, 答案 "是", 也 "不是", 要看你在終端機用什麼軟體看 windows/big5 檔案。
t1.txt 是一個 windows/big5 檔案, 內容是 "施逼\r\n"
cat
mate-terminal 使用 utf8
descent@debian64:~$ cat /tmp/t1.txt
�I�G
mate-terminal 使用 big5
descent@debian64:~$ cat /tmp/t1.txt
施逼
descent@debian64:~$
less
mate-terminal 使用 big5
mate-terminal 使用 utf8
mate-terminal 使用 big5
export LESSCHARSET=latin1
施逼
/media/vbox_share/tmp/t1.txt (END)
mate-terminal 使用 utf8
export LESSCHARSET=latin1
�I�G
/media/vbox_share/tmp/t1.txt (END)
git/hg diff 同 less
好了, 重頭戲 vim 來了, 有好幾個組合可以正確顯示 windows/big5 中文, 我要用的組合是:
mate-terminal 使用 utf8 ~/.vimrc set fileencodings=utf-8,big5,gb18030 encoding=utf-8這樣 vim 就會將 t1.txt 用 big5 的編碼打開, 然後轉成 utf8 編碼, 而 termencoding 我沒有設定, 所以和 encoding 一樣是 utf8, 由於 mate-terminal 使用 utf8, 所以一切配合的很好, windows/big5 中文檔案正確顯示, 沒有亂碼。
如果 vim 誤判編碼的話, 使用 :e ++enc=big5, 會讓 vim 重新讀取檔案, 並以 fileencoding = big5 編碼開啟檔案。
使用 vim 寫入中文之後, 也會將這個中文從內部編碼 utf8 轉回原本的 big5 中文編碼, 用 windows notepad 開啟, 中文可以正常顯示。
locale 設定全都是 en_US.UTF-8, 沒有設定為 zh_tw.BIG5。
descent@debian64:tmp$ locale LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
vim 相關編碼設定請參考 ref 1。
另外一個問題是 \r \n, cr, lf 換行問題。
cr: \r, 0xd, ^M lf: \n, 0xa
windows 用 \r\n 來表示換行, linux 用 \n 表示換行, mac 用 \r 表示換行。
vi 很貼心的會偵測檔案格式, 如果是 windows 格式, 會用 windows 換行存檔, 基本上沒什麼問題, 不過在使用 git diff 時, 就會看到多一個 ^M, 就是 cr, git 可以設定讓這些換行符號不當成差異顯示出來。
為什麼以我一個 linux 使用者會有機會遇到 windows/big5 中文檔案呢? 說來話長, 就不說了。
ref:
- VIM 教程/编码/乱码
- DOS 和Unix 文件--vim轉化
- 远程登录linux,使用vi和less查看文本出现中文乱码,使用cat正常
- 【详解】回车 换行 0x0D 0x0A CR LF \r \n的来龙去脉
- [VIM] encoding , fileencoding , and fileencodings
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。