The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

使用 luit 完美解決 Windows Subsystem for Linux 顯示 Big5 字集的問題

對於 WSL (Windows Subsystem for Linux) 一直無法處理 Big5 字元這件事,對我來說就像在一片白牆上的一個污點,明知這面白牆很漂亮,但就是無法不注意牆上的那個污點,一直覺得不完美,直到昨天都還是解決不了。睡一覺之後,想到了一個新的關鍵字,找到了一個 luit 工具,這就是我昨天一直想要找到的工具!

我現在知道在 WSL 底下,只能處理 Unicode 字集,任何 non-Unicode 字集都無法正常顯示。對於檔案中的內容,我還可以利用 iconv 進行轉換,但如果是互動式的執行環境,例如 vim 或利用 ssh 連到遠端電腦,就沒辦法透過 iconv 進行字元轉譯了。

今天我發現到有個 luit 工具,恰恰就是用來解決「互動式」環境下的字元轉譯功能,把任何應用程式的輸出文字,透過 filter 的方式將文字全部轉成 UTF-8 編碼。這不就是我要的嗎! 😃

小試身手

但是我今天嘗試了好幾個小時,就是無法實驗成功,上網找了無數資料,沒人提到有任何問題,這怎麼可能呢?基本上,我做了以下嘗試:

  1. 安裝 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,但為了測試這個工具,我還是裝起來了,結果悲劇!

  2. 取得一個 Big5 編碼的文字檔案

    curl https://blog.miniasp.com/big5-example.txt -o big5-example.txt
    
  3. 測試將檔案內容透過 luit 輸出

    luit -encoding big5 cat big5-example.txt
    

    結果得到 4z8U 這個結果:

    luit -encoding big5 cat big5-example.txt

  4. 我還嘗試了各種組合用法,依然無解

    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
    
  5. 我還額外加裝了許多語言套件

    查詢支援的 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 環境,總之,就是雷!

  6. 復原設定

    sudo apt remove x11-utils -y
    sudo update-locale LANG=en_US.UTF8
    

改用 luit 2.0 版本

後來發現 luit 有個 2.0 版,但是沒有 Ubuntu 的安裝套件,必須從原始碼進行編譯。我在重新編譯之後,很開心的終於解決了我多年以來的問題! 😃

  1. 下載原始碼

    wget https://invisible-island.net/datafiles/release/luit.tar.gz
    tar zxvf luit.tar.gz && cd luit-20210218
    
  2. 建置與安裝

    sudo apt-get install -y build-essential
    
    ./configure --prefix=/usr && make && sudo make install
    
    man luit
    
    luit -V
    
    luit - 2.0-20210218
    
  3. 測試執行

    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
    

    上述命令全部都成功輸出「測試」兩個中文字!

  4. 這套工具真的厲害的地方,就是連 vi 這種互動情境下也可以用!

    luit -encoding big5 vi big5-example.txt
    
  5. 我也可以透過 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
    
  6. 最後,設定幾個好用的 alias 命令供日後使用

    alias catb5='luit -encoding big5 cat'
    alias sshb5='luit -encoding big5 ssh'
    

最後終於能解決這個多年來的難題,真的是太棒啦! 😍

相關連結