9

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

 3 years ago
source link: https://blog.miniasp.com/post/2021/08/06/Using-luit-solve-WSL-showing-non-Unicode-charset-issue
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
使用 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'
    

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK