Pitfall 2: ファイルエンコーディングに注意
これは比較的初歩的な話なのですが、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にしておくのをお勧めします。