Scala Воспроизвести 2.0. Ошибка компиляции: ошибка ввода-вывода при декодировании

Я загрузил многомодульный проект Scala из GitHub (https://github.com/henrikengstrom/roygbiv), а один из модулей - модуль Play 2.0. Поэтому я могу запускать все приложение, используя команду SBT run для каждого модуля, и все работает нормально. Но когда я добавляю к шаблону Play 2.0 (index.scala.html) неанглийские символы и нажимаю F5 в браузере, я получаю ошибку компиляции:

Ошибка ввода-вывода при декодировании C:\Users...\Web\цель\ scala -2.9.1\src_managed\главная\вид\HTML\index.template.scala с UTF-8 Попробуйте указать другой, используя -encoding Опция

Модуль Play 2.0, который я запускаю, также использует команду SBT run, не используя консоль Play.

Я проверил кодировку исходного файла - это UTF-8. Также попытался UTF-8 без спецификации.

Где может быть проблема?

Ответ 1

Ваша проблема заключается в следующем: ваши промежуточные файлы scala не закодированы правильно.

Вот процесс:

Воспроизведение берет ваш файл шаблона (foo.scala.html) и переводит его в Scala: target/scala-2.10/src_managed/main/views/html/foo.template.scala. Затем он скомпилируется с помощью sbt в файлы .class и запускается в режиме воспроизведения.

Когда sbt создает эти промежуточные файлы, он создает их с кодировкой по умолчанию (в моем случае Windows-машина с UTF-8 без спецификации - ваша машина может отличаться). Важно отметить, что это кодирование имеет место, поэтому, даже если я изменю кодировку исходного файла шаблона (foo.scala.html на UTF-16), кодировка файла .scala остается прежней (UTF-8 без спецификации в моей дело). Однако файл больше не компилируется, потому что файл не может быть прочитан, потому что компилятор scala ожидает ITF-8.

"Правильное" решение - всегда использовать UTF-8, и на самом деле это было рекомендуемое решение для игры 1.x см. Документация по игре Интернационализация. Вот эквивалент для play 2. Вы также можете использовать обычные файлы сообщений интернационализации.

Итак, если вы укажете

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8' sbt

как предложено Bjorn, тогда это скажет sbt, что все файлы, которые он читает и пишет, будут в UTF8. Вы также можете указать кодировку файла для компилятора scala в вашем Build.scala:

val main = play.Project(appName, appVersion, appDependencies).settings(
  scalacOptions ++= Seq("-encoding", "UTF-8")
  // Add your own project settings here      
)

Это сообщает компилятору scala, что все файлы, которые он читает (т.е. foo.template.scala), кодируются в UTF-8. Если вы установите это значение по умолчанию, это может также работать.

Лучше всего сделать sbt clean, гарантируя исчезновение файлов-нарушителей и перезапуск с помощью JAVA_TOOL_OPTION, как было предложено выше. Тем не менее, вы должны убедиться, что все ваши сборки учитывают это (jenkins, другие разработчики и т.д.).

Ответ 2

Вы можете попробовать запустить SBT с принудительной кодировкой UTF-8. Я прочитал в этой статье, что для некоторых людей это помогло запустить SBT со следующей опцией:

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8'

Затем должна отображаться одна из первых строк SBT:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

Ответ 3

Следующие работы отлично подходят для меня. Закодировано в utf-8 по умолчанию eclipse (scala -ide)

@(message: String)

@main("Welcome to Play 2.1") {
    <div>Ελληνικά</div>
    <div>
        @message
    </div>
    <br />
    <ul>
     @for(p<-message) {
     <li>
     @p
     </li>
      }
    </ul>

}

Ответ 4

Какой редактор вы используете для сохранения этих файлов? Возможно, есть вероятность, что ваши символы закодированы в двойном порядке и, таким образом, неправильно сохранены как UTF-8. Например. символы, закодированные в iso-8859-1, снова кодируются как UTF-8.

Ответ 5

У меня была эта проблема, и я понял, что это вызвано некоторыми персонажами моего родного языка, которые у меня были в комментариях (ã). Я удалил их, и ошибка исчезла.