雖然偶爾才遇到... utf8 轉碼 big5 很討厭, 因為 big5 的字集比較小, 會有很多字轉不過去。 今天拿 衛服部「清冠一號動態表」 的中醫診所地址清單做例子, 因為 地址轉經緯度的 TGOS 服務 要求輸入檔案必須採用 big5 編碼。
- 把網頁存成 cg1.html 。
- 轉檔:
python3 html2csv.py cg1.html > cg1.csv
。 - 手動編輯 cg1.csv, 去掉 "###" 以下所有多餘的列。
- 某些列的某些欄位因為內含逗點, 所以被雙引號包起來,
以免那些逗點被當成欄位分隔符號。 比較簡單的方式是:
libreoffice cg1.csv
、 手動刪掉許多欄位, 只保留代號+名稱+地址三欄、 另存新檔成為 2.csv、 再用 nano/geany/vim 手動編輯 2.csv, 找到所有含有雙引號的地址 (共五列)、 手動把每個雙引號及逗號之後的一切都刪掉, 反正不影響查經緯度。 得到 2.csv。
這個討論串
建議安裝套件: apt install zh-autoconvert
然後就可以這樣轉檔: autob5 < 2.csv > 2-big5.csv
這樣最簡單了! 收工下課~ [2023/6 現在這招又失效了 orz]
可是我被 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 找到正確的位置嗎? 我也不知道。 特別是像這種輸入自己店家重要資料的場合, 請務必採用正體中文字形, 以免自已的權益受損。 (有些是診所名稱甚至街道名稱的問題, 那當然就無法只靠選取正確字形解決了。)
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。