Scala Play 2.0。编译错误:解码时发生IO错误

Scala Play 2.0。编译错误:解码时发生IO错误,scala,playframework,playframework-2.0,sbt,multi-module,Scala,Playframework,Playframework 2.0,Sbt,Multi Module,我从GitHub()下载了多模块Scala项目,其中一个模块是Play2.0模块。因此,我可以在每个模块上使用SBT的run命令运行整个应用程序,并且一切正常。但当我将非英语字符添加到Play2.0模板(index.scala.html)并在浏览器中按F5时,我得到编译错误: 解码时发生IO错误 C:\Users…\web\target\scala-2.9.1\src\u managed\main\views\html\index.template.scala 对于UTF-8,请尝试使用-enc

我从GitHub()下载了多模块Scala项目,其中一个模块是Play2.0模块。因此,我可以在每个模块上使用SBT的
run
命令运行整个应用程序,并且一切正常。但当我将非英语字符添加到Play2.0模板(
index.scala.html
)并在浏览器中按F5时,我得到编译错误:

解码时发生IO错误 C:\Users…\web\target\scala-2.9.1\src\u managed\main\views\html\index.template.scala 对于UTF-8,请尝试使用-encoding指定另一个 选择权

播放2.0模块我也使用SBT的
run
命令运行,而不是使用
Play
控制台

我检查了源文件编码-它是UTF-8。还尝试了无BOM的UTF-8


问题出在哪里

以下内容对我来说很好。eclipse默认使用utf-8编码(scala ide)

@(消息:字符串)
@主(“欢迎玩2.1”){
Ελληνικά
@信息


    @为了(p您使用什么编辑器来保存这些文件?您的字符可能是双重编码的,因此被错误地存储为UTF-8。例如,iso-8859-1编码的字符被再次编码为UTF-8。

    您可以尝试使用UTF-8强制编码来启动SBT。我在这篇文章中读到,对于一些人来说,它有助于启动SBT使用以下选项:

    JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8'
    
    然后,SBT的第一行之一应显示:

    Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
    

    您的问题似乎是:中间scala文件的编码不正确

    过程如下:

    Play获取模板文件(
    foo.scala.html
    )并将其转换为scala:
    target/scala-2.10/src\u managed/main/views/html/foo.template.scala
    。然后sbt将其编译为.class文件并按Play运行

    当sbt创建这些中间文件时,它会使用默认编码创建它们(在我的情况下是一台没有BOM的Windows机器,所以UTF-8-您的机器可能会有所不同)。重要的是,这种编码仍然存在,因此即使我将原始模板文件(foo.scala.html)的编码更改为UTF-16,则.scala文件的编码仍然相同(在我的示例中,UTF-8没有BOM)。但是,该文件不再编译,因为无法读取该文件,因为scala编译器需要ITF-8

    “正确”的解决方案是始终使用UTF-8,事实上,这是为play 1.x推荐的解决方案。请参阅。这是的等效解决方案。您也可以使用普通的国际化消息文件

    因此,如果您指定

    JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8' sbt
    
    按照的建议,这将告诉sbt它读取和写入的所有文件都将使用UTF8。您还可以在Build.scala中指定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清理,确保有问题的文件已消失,并按照上述建议使用JAVA_TOOL_选项重新启动。但是,您必须确保所有构建都考虑到这一点(jenkins、其他开发人员等).

    我遇到了这个问题,并发现这是由我在评论中的一些母语字符造成的(ã)。我删除了这些,错误消失了。

    我将triöd Intellij IDEA和记事本++很快将尝试您的solution@Mytitle根据你对这个问题的描述,这很可能是第二次悬赏,现在是300。
    val main = play.Project(appName, appVersion, appDependencies).settings(
      scalacOptions ++= Seq("-encoding", "UTF-8")
      // Add your own project settings here      
    )