5.06.2015

Reading SJIS-Encoded Text File in Scala

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>

 

References

0 件のコメント:

コメントを投稿