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として解釈しようとして失敗しているわけです。

これを回避するには、

    1. 最初からUTF-8でscalaプログラムを書く

    2. -encodingオプションを指定する

のどちらかを選ぶことになります。前者の場合は自明ですので説明は省きますが、後者の場合、

> scalac -encoding Shift_JIS Hello.scala

のように、ファイルエンコーディングを指定してコンパイルすることになります。

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