我从GitHub(https://github.com/henrikengstrom/roygbiv)下载了多模块Scala项目,其中一个模块是Play 2.0模块。所以我可以在每个模块上使用SBT的run
命令运行整个应用程序,一切正常。但是,当我添加到Play 2.0模板(index.scala.html
)非英文字符并在浏览器中按F5时,我收到编译错误:
解码时出现IO错误 C:\用户\网络\目标\斯卡拉-2.9.1 \ src_managed \主\意见\ HTML \ index.template.scala 使用UTF-8请尝试使用-encoding指定另一个 选项
播放2.0模块我也使用SBT的run
命令运行,而不是使用Play
控制台。
我检查了源文件编码 - 它是UTF-8。还尝试了没有BOM的UTF-8。
哪里有问题?
答案 0 :(得分:5)
您可以尝试使用强制编码将SBT启动到UTF-8。我在这篇post中读到,对于某些人来说,它有助于使用以下选项启动SBT:
JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8'
然后SBT的第一行应该显示:
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
答案 1 :(得分:4)
您的问题似乎是这样:您的中间scala文件编码不正确。
以下是流程:
播放获取模板文件(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,事实上这是建议播放1.x的解决方案,请参阅Play documentation 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编码的。如果将其设置为默认编码,则也可以这样做。
最好的办法是干净利落,确保有问题的文件已经消失,并按照上面的建议使用JAVA_TOOL_OPTION重新启动。但是,您必须确保所有构建都考虑到这一点(jenkins,其他开发人员等)。
答案 2 :(得分: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>
}
答案 3 :(得分:2)
您使用什么编辑器保存这些文件?您的角色可能有双重编码,因此错误地存储为UTF-8。例如。以iso-8859-1编码的字符再次编码为UTF-8。
答案 4 :(得分:1)
我遇到了这个问题并且发现它是由我在评论(ã)中使用的一些我的母语字符引起的。我删除了那些,错误消失了。