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

對於 WSL ([Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/about?WT.mc_id=DT-MVP-4015686)) 一直無法處理 Big5 字元這件事，對我來說就像在一片白牆上的一個污點，明知這面白牆很漂亮，但就是無法不注意牆上的那個污點，一直覺得不完美，直到昨天都還是解決不了。睡一覺之後，想到了一個新的關鍵字，找到了一個 [luit](https://invisible-island.net/luit/) 工具，這就是我昨天一直想要找到的工具！

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

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

### 小試身手

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

1.  安裝 luit 工具
    
    在 Ubuntu 20.04 LTS 裡面，[luit](https://invisible-island.net/luit/) 被封裝在 `x11-utils` 套件中，所以你可以這樣安裝：
    
    ```bash
    sudo apt install x11-utils -y
    ```
    
    ```
    $ luit -V
    luit - 1.1.1
    ```
    
    > 從名稱可以看到這是 x11 的工具套件，但我的 Ubuntu Linux 都是 Server 版為主，用不到 x11，但為了測試這個工具，我還是裝起來了，結果悲劇！
    
2.  取得一個 Big5 編碼的文字檔案
    
    ```bash
    curl https://blog.miniasp.com/big5-example.txt -o big5-example.txt
    ```
    
3.  測試將檔案內容透過 luit 輸出
    
    ```bash
    luit -encoding big5 cat big5-example.txt
    ```
    
    結果得到 `4z8U` 這個結果：
    
    ![luit -encoding big5 cat big5-example.txt](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/ff6b96c6804a1ee5541e-128517671-a6f90791-3a06-4a91-8b14-f95b3ec7d256.png)
    
4.  我還嘗試了各種組合用法，依然無解
    
    ```bash
    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 區域設定
    
    ```bash
    locale -a
    ```
    
    ```
    C
    C.UTF-8
    POSIX
    en_US.utf8
    ```
    
    增加繁體中文語言套件 (`language-pack-zh-hant`)
    
    ```bash
    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` 區域設定
    
    ```bash
    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 語言設定
    
    ```bash
    sudo update-locale LANG=zh_TW.big5
    ```
    
    看來這套工具跟 WSL 不太合拍，覺得非常可惜，同時覺得納悶，原來網路上提到的文章，通通都是在原生的 Ubuntu 環境下，並非使用 WSL 環境，總之，就是雷！
    
6.  復原設定
    
    ```bash
    sudo apt remove x11-utils -y
    sudo update-locale LANG=en_US.UTF8
    ```
    

### 改用 luit 2.0 版本

後來發現 [luit](https://invisible-island.net/luit/) 有個 2.0 版，但是沒有 Ubuntu 的安裝套件，必須從原始碼進行編譯。我在重新編譯之後，很開心的終於解決了我多年以來的問題！ 😃

1.  下載原始碼
    
    ```bash
    wget https://invisible-island.net/datafiles/release/luit.tar.gz
    tar zxvf luit.tar.gz && cd luit-20210218
    ```
    
2.  建置與安裝
    
    ```bash
    sudo apt-get install -y build-essential
    
    ./configure --prefix=/usr && make && sudo make install
    
    man luit
    
    luit -V
    ```
    
    ```
    luit - 2.0-20210218
    ```
    
3.  測試執行
    
    ```bash
    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` 這種互動情境下也可以用！
    
    ```bash
    luit -encoding big5 vi big5-example.txt
    ```
    
5.  我也可以透過 `ssh` 連到遠端電腦的時候跑在 `luit` 底下，然後就可以在遠端完美的使用 `big5` 字集的操作！
    
    ```bash
    luit -encoding big5 ssh user@host
    
    # remote host
    cat big5-example.txt
    ```
    
    我可以連到遠端的 Sybase ASE 資料庫主機，使用 `isql` 進行查詢資料也終於不會看到亂碼，可以完美的顯示正確的中文字了！
    
    ```bash
    cat <<EOF | isql -Dsampledb -w 20000
    select * from tblname
    go
    EOF
    ```
    
6.  最後，設定幾個好用的 `alias` 命令供日後使用
    
    ```bash
    alias catb5='luit -encoding big5 cat'
    alias sshb5='luit -encoding big5 ssh'
    ```
    

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

### 相關連結

-   [luit - Locale and ISO 2022 support for Unicode terminals](https://invisible-island.net/luit/)
-   [luit - Wikipedia](https://en.wikipedia.org/wiki/Luit)
-   [Locale - Ubuntu 18.04 探索筆記](https://samwhelp.github.io/note-ubuntu-18.04/read/howto/install/locale/)
-   [Feature Request: Character Set translation #10870](https://github.com/microsoft/terminal/issues/10870)
