2018年6月15日 星期五

在 linux 下處理 windows/dos 格式的中文檔案

在 linux 下一般都是 utf8/unix 格式的編碼, 那處理中文 big5/windows/dos 格式時會遇到什麼問題?

會影響中文正確的程式很多, 這邊以我自己遇到的程式來說明:
  1. 終端機
  2. vim
  3. 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
less.txt
1
2 <AC>I<B9>G
3 /media/vbox_share/tmp/t1.txt (END)

mate-terminal 使用 utf8
less.txt
1
2 <AC>I<B9>G
3 /media/vbox_share/tmp/t1.txt (END)

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:
  1. VIM 教程/编码/乱码
  2. DOS 和Unix 文件--vim轉化
  3. 远程登录linux,使用vi和less查看文本出现中文乱码,使用cat正常
  4. 【详解】回车 换行 0x0D 0x0A CR LF \r \n的来龙去脉
  5. [VIM] encoding , fileencoding , and fileencodings



沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。