10

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

使用 UTF-8 解码 C:\Users...\web\target\scala-2.9.1\src_managed\main\views\html\index.template.scala 时出现 IO 错误 请尝试使用 -encoding 选项指定另一个

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

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

哪里可能有问题?

4

5 回答 5

5

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

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8'

然后 SBT 的第一行应该显示:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
于 2013-05-21T16:07:58.503 回答
4

您的问题似乎是这样的:您的中间 scala 文件未正确编码。

这是过程:

Play 获取您的模板文件 ( foo.scala.html) 并将其转换为 Scala: target/scala-2.10/src_managed/main/views/html/foo.template.scala. 然后它被 sbt 编译为 .class 文件并由 play 运行。

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

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

所以,如果你指定

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8' sbt

正如Bjorn所建议的那样,这将告诉 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 clean,确保有问题的文件已经消失,然后按照上面的建议使用 JAVA_TOOL_OPTION 重新启动。但是,您必须确保所有构建都考虑到这一点(詹金斯、其他开发人员等)。

于 2013-06-18T12:18:22.917 回答
2

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

于 2013-05-21T14:01:08.130 回答
2

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

@(message: String)

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

}
于 2013-05-14T00:28:14.067 回答
1

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

于 2013-07-29T17:30:05.220 回答