文字コードを推測する

文字列の文字コードを推測するには、Mozillaエンコーディング判別ライブラリ
universalchardetのJava版を使う。

ソース

import org.mozilla.universalchardet.UniversalDetector;
def String getCodeName(fileName) {
    f = new File(fileName)
    fis = new FileInputStream(f)
    len = (int)f.length()
    buf = new byte[len];

    detector = new UniversalDetector(null);
    while ((nread = fis.read(buf)) > 0 && ! detector.isDone()) {
        detector.handleData(buf, 0, nread);
    }
    detector.dataEnd();

    encoding = detector.getDetectedCharset()
    encoding = (encoding != null) ? encoding : "Unkown"
    detector.reset();
    return encoding;

}


println "SJIStoEUC.txt:" + getCodeName("SJIStoEUC.txt")
println "SJIStoISO-2022-JP.txt:" + getCodeName("SJIStoISO-2022-JP.txt")
println "SJIStoJIS.txt:" + getCodeName("SJIStoJIS.txt")
println "SJIStoUTF-8.txt:" + getCodeName("SJIStoUTF-8.txt")

実行環境

実行結果

ファイルは前回変換したときに作成したファイル

groovysh -cp C:\usr\lib\code.google.com\juniversalchardet-1.0.3.jar
groovy:000> load GetCodeName.groovy
===> [import org.mozilla.universalchardet.UniversalDetector;]
===> true
SJIStoEUC.txt:Unkown
===> null
SJIStoISO-2022-JP.txt:ISO-2022-JP
===> null
SJIStoJIS.txt:ISO-2022-JP
===> null
SJIStoUTF-8.txt:UTF-8
===> null


あらら?EUC-JPが判定できてない。
なんでや!?