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 が使われるようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | scala> implicit val codec = scalax.io.Codec( "Windows-31J" ) codec : scalax.io.Codec = scalax.io.Codec @ 7 f 1 ecf 06 scala> scalax.file.Path( "foo.txt" ).write( "あいう" ) scala> scalax.file.Path( "foo.txt" ).string res 1 : String = あいう scala> implicit val codec = scalax.io.Codec.UTF 8 codec : scalax.io.Codec = scalax.io.Codec @ 76783189 scala> scalax.file.Path( "foo.txt" ).string // SJIS形式のテキストファイルを res 2 : String = ������ // UTF8で読み込もうとしたので文字化け scala> scalax.file.Path( "foo.txt" ).write( "あいう" ) scala> scalax.file.Path( "foo.txt" ).string res 4 : String = あいう |
InputStreamReader で読み込む
java.io.InputStreamReader を使いたい場合は、コンストラクトの第二引数に charset を指定すればよい。
これは Codec#name で得ることができる。
new InputStreamReader( new FileInputStream( "foo.xml" ), "windows-31j" ) |
使用例
1 2 3 4 5 6 7 8 | scala> implicit val codec = scalax.io.Codec( "Windows-31J" ) codec : scalax.io.Codec = scalax.io.Codec @ 69 b 68 c 37 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)) res 1 : scala.xml.Elem = <foo>bar</foo> |
0 件のコメント:
コメントを投稿