對於 WSL (Windows Subsystem for Linux) 一直無法處理 Big5 字元這件事,對我來說就像在一片白牆上的一個污點,明知這面白牆很漂亮,但就是無法不注意牆上的那個污點,一直覺得不完美,直到昨天都還是解決不了。睡一覺之後,想到了一個新的關鍵字,找到了一個 luit 工具,這就是我昨天一直想要找到的工具!
我現在知道在 WSL 底下,只能處理 Unicode 字集,任何 non-Unicode 字集都無法正常顯示。對於檔案中的內容,我還可以利用 iconv 進行轉換,但如果是互動式的執行環境,例如 vim
或利用 ssh
連到遠端電腦,就沒辦法透過 iconv 進行字元轉譯了。
今天我發現到有個 luit 工具,恰恰就是用來解決「互動式」環境下的字元轉譯功能,把任何應用程式的輸出文字,透過 filter 的方式將文字全部轉成 UTF-8 編碼。這不就是我要的嗎! 😃
小試身手
但是我今天嘗試了好幾個小時,就是無法實驗成功,上網找了無數資料,沒人提到有任何問題,這怎麼可能呢?基本上,我做了以下嘗試:
-
安裝 luit 工具
在 Ubuntu 20.04 LTS 裡面,luit 被封裝在 x11-utils
套件中,所以你可以這樣安裝:
sudo apt install x11-utils -y
$ luit -V
luit - 1.1.1
從名稱可以看到這是 x11 的工具套件,但我的 Ubuntu Linux 都是 Server 版為主,用不到 x11,但為了測試這個工具,我還是裝起來了,結果悲劇!
-
取得一個 Big5 編碼的文字檔案
curl https://blog.miniasp.com/big5-example.txt -o big5-example.txt
-
測試將檔案內容透過 luit 輸出
luit -encoding big5 cat big5-example.txt
結果得到 4z8U
這個結果:
-
我還嘗試了各種組合用法,依然無解
LC_CTYPE=zh_TW luit cat big5-example.txt
luit -encoding 'Big 5' cat big5-example.txt
luit -encoding 'BIG5-HKSCS' cat big5-example.txt
-
我還額外加裝了許多語言套件
查詢支援的 locale 區域設定
locale -a
C
C.UTF-8
POSIX
en_US.utf8
增加繁體中文語言套件 (language-pack-zh-hant
)
sudo apt-get install language-pack-zh-hant -y
locale -a
C
C.UTF-8
POSIX
en_US.utf8
zh_HK.utf8
zh_TW.utf8
以下這個步驟會自動加入 zh_TW.Big5
區域設定
sudo locale-gen zh_TW
locale -a
C
C.UTF-8
POSIX
en_US.utf8
zh_HK.utf8
zh_TW
zh_TW.big5
zh_TW.utf8
修改全域 locale 語言設定
sudo update-locale LANG=zh_TW.big5
看來這套工具跟 WSL 不太合拍,覺得非常可惜,同時覺得納悶,原來網路上提到的文章,通通都是在原生的 Ubuntu 環境下,並非使用 WSL 環境,總之,就是雷!
-
復原設定
sudo apt remove x11-utils -y
sudo update-locale LANG=en_US.UTF8
改用 luit 2.0 版本
後來發現 luit 有個 2.0 版,但是沒有 Ubuntu 的安裝套件,必須從原始碼進行編譯。我在重新編譯之後,很開心的終於解決了我多年以來的問題! 😃
-
下載原始碼
wget https://invisible-island.net/datafiles/release/luit.tar.gz
tar zxvf luit.tar.gz && cd luit-20210218
-
建置與安裝
sudo apt-get install -y build-essential
./configure --prefix=/usr && make && sudo make install
man luit
luit -V
luit - 2.0-20210218
-
測試執行
luit -encoding big5 cat big5-example.txt
LC_ALL=zh_TW luit cat big5-example.txt
LC_ALL=zh_TW.Big5 luit cat big5-example.txt
上述命令全部都成功輸出「測試」兩個中文字!
-
這套工具真的厲害的地方,就是連 vi
這種互動情境下也可以用!
luit -encoding big5 vi big5-example.txt
-
我也可以透過 ssh
連到遠端電腦的時候跑在 luit
底下,然後就可以在遠端完美的使用 big5
字集的操作!
luit -encoding big5 ssh user@host
# remote host
cat big5-example.txt
我可以連到遠端的 Sybase ASE 資料庫主機,使用 isql
進行查詢資料也終於不會看到亂碼,可以完美的顯示正確的中文字了!
cat <<EOF | isql -Dsampledb -w 20000
select * from tblname
go
EOF
-
最後,設定幾個好用的 alias
命令供日後使用
alias catb5='luit -encoding big5 cat'
alias sshb5='luit -encoding big5 ssh'
最後終於能解決這個多年來的難題,真的是太棒啦! 😍
相關連結