eachを使ってファイルを読む場合の文字コード指定
Thoughtworksアンソロジーの多言語プログラミングの章で紹介されているコード。
def number = 0 new File(args[0]).eachLine { line-> number++ println "${number}:${line}" }
ファイルを1行ずつ読んで、行番号付きで標準出力に書き出すだけのコードだけど、javaだと結構長くなる、groovyなら短いよ、と。
windowsで上記のコードを実行した場合、test.txtがsjis、utf8だと問題なく読めるけど、eucjpだと文字化けする。
内部的にCharsetToolkitというクラスので内部メソッドguessEncodingで文字コードを推定していて、
UTF-8、US-ASCII、UTF-16LE、UTF-16BEのいずれかを判定しようとする。
どれでもないとOSのデフォルトで読む。(Windowsの場合、Windows-31j)
なので読みこむファイルがeuc-jpとか、自動判定で判別できない文字コードだとわかっている場合は
def number = 0 new File(args[0]).newReader("eucjp").eachLine{ number++ println "${number}:${line}" }
こうしとけばとりあえず読める。
ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション
posted with amazlet at 09.03.13