在 unicode 文字檔裡檢查 big5 字元
之前碰到一個問題就是,我們有一堆 UTF-8 的 XML 檔案,但實際上這些檔案應該都只包含中文字,也就是可以用 BIG5 呈現的字。然而,因為是 UTF-8 是 Unicode 的關係,所以實際上可能存在有無法轉換成 BIG5 的字,因而違反程式的期待,造成程式的問題。為了避免這樣子的問題,我們必須要檢查這堆 UTF-8 的 XML 檔案,確認每個檔案裡用到的每個 UTF-8 字元,都可以被轉換成 BIG5。這個問題,在考慮到其實 BIG5 也有很多變種的情況下,越是複雜。
不過還好,想通了話其實就很簡單:用 iconv 試轉不就得了:
SHELL> find . -type f -name '*.xml' \
| xargs -n 1 -t -x iconv -f UTF-8 -t CP950 \
> /dev/null 2> conv.log
這裡需注意的是,必須要用 sh 或 bash 跑這個指令,因為 csh/tcsh 不能夠把 stdout 與 stderr 分開 redirect。又,CP950 是 Windows 中文版用的 charset,是 BIG5 的其中一個變種。
然後用 grep 把有問題的檔案過濾出來:
SHELL> cat conv.log | grep 'cannot convert' iconv: ./Sogi0300.xml: cannot convert iconv: ./Sogi0420.xml: cannot convert iconv: ./Sogi0869.xml: cannot convert iconv: ./Sogi1068.xml: cannot convert iconv: ./Sogi1275.xml: cannot convert
再一個一個重跑 iconv 找出問題點即可:
SHELL> iconv -f UTF-8 -t CP950 ./Sogi0300.xml
<?xml version="1.0" ?>
<sogi-spec id="Sogi0300" name="Alcatel OT512" imgsrc="Sogi0300.jpg">
<category name="螢幕">
<property name="螢幕背光燈" value="藍白背光加強型顯示幕" />
<property name="螢幕" value=":可使用縮放效果, 最多6行文字, 最少4行文字" />
<property name="主螢幕解析度" value="96 * 65 pixels" />
<property name="螢幕娛樂" value="開機動畫, 關機動畫, 遊戲, 待機圖案" />
</category>
<category name="機身外觀">
<property name="尺寸" value="97 * 42 * 20 mm" />
iconv: SogiDB-v0.4-r190-20050509-163814/Sogi0300.xml: cannot convert
<property name="機身顏色" value="浮世金、雅仕銀,螢幕的外框和液晶改Exit 1
噹噹!錯誤發生在「改」字的後面。
更新 2005-11-04:我這篇《List non utf-8 encoded files》講的是一樣的事情。
Post a Comment