使用HTML页面播放Framework Ning WS API编码问题

时间:2014-10-16 16:51:17

标签: scala http character-encoding playframework-2.0

我正在使用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")))

正确显示。所以我有一个有效的解决方案,但为什么不在内部完成呢?

1 个答案:

答案 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