2022年9月4日 星期日

轉碼 big5 除錯記

雖然偶爾才遇到... utf8 轉碼 big5 很討厭, 因為 big5 的字集比較小, 會有很多字轉不過去。 今天拿 衛服部「清冠一號動態表」 的中醫診所地址清單做例子, 因為 地址轉經緯度的 TGOS 服務 要求輸入檔案必須採用 big5 編碼。

  1. 把網頁存成 cg1.html 。
  2. 轉檔: python3 html2csv.py cg1.html > cg1.csv
  3. 手動編輯 cg1.csv, 去掉 "###" 以下所有多餘的列。
  4. 某些列的某些欄位因為內含逗點, 所以被雙引號包起來, 以免那些逗點被當成欄位分隔符號。 比較簡單的方式是: libreoffice cg1.csv、 手動刪掉許多欄位, 只保留代號+名稱+地址三欄、 另存新檔成為 2.csv、 再用 nano/geany/vim 手動編輯 2.csv, 找到所有含有雙引號的地址 (共五列)、 手動把每個雙引號及逗號之後的一切都刪掉, 反正不影響查經緯度。 得到 2.csv

這個討論串 建議安裝套件: apt install zh-autoconvert 然後就可以這樣轉檔: autob5 < 2.csv > 2-big5.csv 這樣最簡單了! 收工下課~

可是我被 iconv 誤了很多時間, 不甘心, 一定要分享一下使用心得。 如果用 iconv 直接轉檔: iconv -f utf8 -t big5 2.csv > 2-big5.csv 結果每遇到任何一個字轉不出來, 就直接放棄, 好弱啊! 跟我一樣沒有毅力, 一遇到困難就很容易放棄, 哈哈~ 根據 這一篇 可以改成這樣下指令: iconv -f utf8 -t big5//TRANSLIT 2.csv > 2-big5.csv 一遇到轉不出來的字就隨便塞一個替代的字, 至少可以整個檔案都轉完。 不過到底替換了哪些字? 是否恰當呢? 看不出來。

所以我寫了這個小程式: db-iconv.py, 餵給它一個文字檔, 像這樣: python3 db-iconv.py 2.csv 它會把檔案拆成一列一列, 每列呼叫一次 iconv, 只印出 「轉換失敗的那些列」 和錯誤訊息:

69,啓源中醫診所,台中市西屯區西屯路三段166~3號
!   67 iconv: 位置 3 有不合法的輸入序列
70,許啓仁中醫診所,台中市大里區永隆路31號
!   68 iconv: 位置 6 有不合法的輸入序列
260,欣悦中醫診所,台北市松山區南京東路四段193號
!  258 iconv: 位置 7 有不合法的輸入序列
262,明悦中醫診所,台北市大安區忠孝東路四段210-1號9樓
!  260 iconv: 位置 7 有不合法的輸入序列
516,黄柯埠中醫診所,台中市豐原區中山路552號1樓
!  514 iconv: 位置 4 有不合法的輸入序列
569,駿發中醫診所,台中市大里區中興路2段671 巷6一2号
!  567 iconv: 位置 66 有不合法的輸入序列
1002,宏安中醫診所,新北巿三重區自強路一段254号
! 1000 iconv: 位置 60 有不合法的輸入序列
1116,咏敬中醫診所,桃園市桃園區信光路87號
! 1114 iconv: 位置 5 有不合法的輸入序列
1398,一苼堂中醫診所,高雄市苓雅區光華一路33號1樓
! 1396 iconv: 位置 8 有不合法的輸入序列
1437,健誠中醫診所,高雄市左營區廍後街34號
! 1435 iconv: 位置 42 有不合法的輸入序列

有些字很明顯, 像是簡體的 「号」。 至於那些不確定的字, 可以用數的, 每個英數半形佔 1 byte, 每個中文或全形佔 3 bytes, 位置從 0 開始數起。 數完之後, 可以這樣確認 (以輸出的第一列為例, 用剪貼的): echo '啓源' | iconv -f utf8 -t big5 「啓」 有什麼問題嗎? 原來它跟 「啟」 的編碼不同: echo '啟啓' | xxd 得知常用正體中文的 「啟」 的編碼是 e5 95 9f 而 2.csv 第67列的 「啓」 的編碼則是 e5 95 93。 (最後的 0a 是換列字元。) 再用文字編輯器逐一編輯後, 得到 3.csv。 可以用 meld 2.csv 3.csv 比較兩者。 這個新的版本, iconv 就可以吃得下去了。

一方面, 希望那些 big5 only 的老舊系統可以趕快汰換掉; 另一方面也要呼籲大家沒事不要把對岸的中文字拿進來混用。 像我在處理清冠一號地址資料時, 如果偷懶一點直接用 autob5 或 iconv 的 TRANSLIT, 那些被近似字替換掉的列, 還能夠用 TGOS 找到正確的位置嗎? 我也不知道。 特別是像這種輸入自己店家重要資料的場合, 請務必採用正體中文字形, 以免自已的權益受損。 (有些是診所名稱甚至街道名稱的問題, 那當然就無法只靠選取正確字形解決了。)

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。