2014-10-16 32 views
1

我正在使用Play Framework 2.3和WS API下載和解析HTML頁面。對於非英文頁面(例如俄文,希伯來文),我經常會遇到錯誤的編碼。Play框架Ning WS API編碼問題與HTML頁面

下面是一個例子:

def test = Action.async { request => 

    WS.url("http://news.walla.co.il/item/2793388").get.map { response => 
     Ok(response.body) 
    } 
} 

這將返回網頁的HTML。英文字符收到好了。希伯來字母顯示爲Gibberish。 (不僅在渲染時,在內部字符串級別)。像這樣:

<title>29 ×ר×××× ××פ××ת ×ש×××× ×× ×¤××, ××× ×©×××©× ×שר×××× - ×××××! ××ש×ת</title> 

來自同一個網站的其他文章可以顯示正常。

使用cURL與相同的網頁返回完美罰款,這讓我相信問題是在WS API內。

任何想法?

編輯:

我找到了解決辦法in this SO question

解析響應作爲ISO-8859-1,然後將它樣如此轉換爲UTF-8

Ok(new String(response.body.getBytes("ISO-8859-1") , response.header(CONTENT_ENCODING).getOrElse("UTF-8"))) 

正確顯示。所以我有一個可行的解決方案,但爲什麼這不是內部完成的?

+0

我相信這樣做了,但默認是'utf-8' 。 – 2014-10-20 17:42:41

+0

您可以發佈問題的答案並順便接受。 – 2014-10-20 17:43:04

回答

1

好吧,這裏的解決方案,我結束了在生產中使用:

def responseBody = response.header(CONTENT_TYPE).filter(_.toLowerCase.contains("charset")).fold(new String(response.body.getBytes("ISO-8859-1") , "UTF-8"))(_ => response.body) 

說明:

如果請求返回「的Content-Type」報頭還指定字符集,簡單地返回響應正文WS API將使用它來正確解碼,否則,假設響應是ISO-8859-1編碼並將其轉換爲UTF-8