Scala: SJIS形式のテキストファイルを読み込む方法
Scala IO での読み書き
ライブラリの Scala IO を利用するのがデファクトスタンダード。
sbt設定
libraryDependencies += "com.github.scala-incubator.io" %% "scala-io-core" % "0.4.3" libraryDependencies += "com.github.scala-incubator.io" %% "scala-io-file" % "0.4.3"
Codec を定義
implicit value として Codec を定義すれば、その後発生する読み書きで、指定した Codec が使われるようになる。
scala> implicit val codec = scalax.io.Codec("Windows-31J") codec: scalax.io.Codec = scalax.io.Codec@7f1ecf06 scala> scalax.file.Path("foo.txt").write("あいう") scala> scalax.file.Path("foo.txt").string res1: String = あいう scala> implicit val codec = scalax.io.Codec.UTF8 codec: scalax.io.Codec = scalax.io.Codec@76783189 scala> scalax.file.Path("foo.txt").string // SJIS形式のテキストファイルを res2: String = ������ // UTF8で読み込もうとしたので文字化け scala> scalax.file.Path("foo.txt").write("あいう") scala> scalax.file.Path("foo.txt").string res4: String = あいう
InputStreamReader で読み込む
java.io.InputStreamReader を使いたい場合は、コンストラクトの第二引数に charset を指定すればよい。
これは Codec#name で得ることができる。
new InputStreamReader(new FileInputStream("foo.xml"), "windows-31j")
使用例
scala> implicit val codec = scalax.io.Codec("Windows-31J") codec: scalax.io.Codec = scalax.io.Codec@69b68c37 scala> scalax.file.Path("foo.xml").write("<foo>bar</foo>") scala> scala.xml.XML.load(new java.io.InputStreamReader( | new java.io.FileInputStream("foo.xml"), codec.name)) res1: scala.xml.Elem = <foo>bar</foo>
0 件のコメント:
コメントを投稿