我正在使用Play Framework 2.3和WS API来下载和解析HTML页面。对于非英语页面(例如俄语,希伯来语),我经常得到错误的编码。
以下是一个例子:
def test = Action.async { request =>
WS.url("http://news.walla.co.il/item/2793388").get.map { response =>
Ok(response.body)
}
}
这将返回网页的HTML。收到英文字符确定。希伯来字母显示为胡言乱语。 (不仅在渲染时,在内部字符串级别)。像这样:
<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 :(得分: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