2013-05-13 109 views
10

我從GitHub下載了多模塊Scala項目(https://github.com/henrikengstrom/roygbiv),其中一個模塊是Play 2.0模塊。所以我可以在每個模塊上使用SBT的run命令來運行整個應用程序,並且所有工作都正常。但是,當我添加到播放2.0模板(index.scala.html)非英文字符,然後按F5在瀏覽器中,我得到的編譯錯誤:Scala Play 2.0。編譯錯誤:解碼時出現IO錯誤

IO error while decoding C:\Users...\web\target\scala-2.9.1\src_managed\main\views\html\index.template.scala with UTF-8 Please try specifying another one using the -encoding option

播放2.0模塊我跑得還採用SBT的run命令,不使用Play控制檯。

我檢查了源文件編碼 - 它是UTF-8。還嘗試了沒有BOM的UTF-8。

哪裏有問題?

+0

打開第二個賞金,現在300. – MyTitle 2013-06-13 08:20:35

回答

4

您的問題似乎是這樣的:您的中間scala文件編碼不正確。

下面的過程是:

遊戲需要你的模板文件(foo.scala.html),並轉化爲斯卡拉這樣的:target/scala-2.10/src_managed/main/views/html/foo.template.scala。然後這被sbt編譯爲.class文件並通過播放運行。

當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編譯器指定文件編碼。階:

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

這告訴它讀取的所有文件(即foo.template.scala)以UTF-8編碼階編譯器。如果你將它設置爲你的默認編碼,這也可以。

最好的辦法是做一次清理,確保有問題的文件已經消失,然後按照上面的建議重新啓動JAVA_TOOL_OPTION。但是,您必須確保所有構建都考慮到這一點(jenkins,其他開發人員等)。

2

以下工作適合我。編碼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> 

} 
2

你用什麼編輯器來保存這些文件?您的字符可能被雙重編碼,因此可能被錯誤地存儲爲UTF-8。例如。在iso-8859-1中編碼的字符再次編碼爲UTF-8。

+0

我第三次Intellij IDEA和記事本++ – MyTitle 2013-05-21 16:59:37

5

您可以嘗試啓動SBT,強制編碼爲UTF-8。我在這個post閱讀,對於一些人來說,幫助有以下選項啓動SBT:

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8' 

然後SBT的第一線之一應顯示:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 
+0

將很快嘗試你的解決方案 – MyTitle 2013-06-13 08:08:09

+0

@Mytitle給出你的問題描述這很可能是解決方案 – 2013-06-17 08:19:20

1

我有這個問題,並且發現它是由我在評論中使用的母語的一些字符引起的(ã)。我刪除了這些,錯誤消失了。