Skip to content

scala pitfalls : file encoding

Taisuke Oe edited this page Apr 11, 2015 · 1 revision

##ファイルエンコーディングに注意

これは比較的初歩的な話なのですが、Javaを普段使っている人がScalaを使い始めたときにしばしばはまる罠です。基本的には、すぐに気づく話ですが、念のため述べておきます。

(少なくともOracle JDKの)javacでは、特にオプションを指定しない場合、Javaプログラムのファイルエンコーディングを、プラットフォームのデフォルトエンコーディングとみなしてコンパイルしようとします。

一方、scalacでは、特にオプションを指定しない場合、ファイルエンコーディングをUTF-8として解釈します。そのため、たとえば、Windows環境でShift_JISでscalaプログラムを書いた場合、たとえば、

object Hello extends App {
  println("はろー")
}

のようなプログラムのファイルエンコーディングがShift_JISだった場合、scalacは

java.io.IOException: MALFORMED[1]
        at scala.tools.nsc.io.SourceReader$.decode(SourceReader.scala:137)
        at scala.tools.nsc.io.SourceReader.read(SourceReader.scala:91)
...
error: IO error while decoding Hello.scala with UTF-8
Please try specifying another one using the -encoding option

のようなエラーメッセージを吐きます。最後から2番目の行を読めばわかるように、テキストのエンコーディングをデフォルトではUTF-8として解釈しようとして失敗しているわけです。

これを回避するには、

最初からUTF-8でscalaプログラムを書く -encodingオプションを指定する のどちらかを選ぶことになります。前者の場合は自明ですので説明は省きますが、後者の場合、

scalac -encoding Shift_JIS Hello.scala

のように、ファイルエンコーディングを指定してコンパイルすることになります。 どちらを選ぶかはユーザの自由ですが、基本的には、あえて-encodingオプションを使わなければならない理由が無い限り、ScalaプログラムのソースコードはデフォルトのUTF-8にしておくのをお勧めします。