我正在从API接收XML数据。数据在我的服务器上转换为JSON,并保存在Mongo数据库中。

问题是,我收到的XML是在ISO-8859-1中编码的,并使用斯堪的纳维亚字母å,ä和ö。响应头中未指定编码。

我可以在浏览器中查看XML,特殊字母显示得很好,但是在我的GET请求响应中,特殊字母在控制台和MongoDB中的黑框(�)中显示为问号。

在我的GET请求中,我发送了"Content-Type": "application/xml; charset=utf-8"标头,但响应仍按照ISO-8859-1发送。

我在这里有什么选择?我可以以某种方式将转换为正确的字符吗?


附加信息

再次更新:

response = HTTP.call('GET', 'http://removed.url/rss.xml', {
    headers: {
        "Accept-Charset": "utf-8"
    }
});
data = Buffer.from(response.content, 'binary').toString('binary');

console.log(data);

最佳答案

Content-Type响应中发送GET没有任何意义。该标头指示资源的媒体类型,服务器是发送此标头以响应您的GET请求的。同样,它可以在PUTPOST请求中发送,以指示已发送内容的媒体类型。

您可能应该使用Accept-Charset标头,它告诉服务器客户端可以理解哪些字符集:

Accept-Charset: utf-8


另外,这可能是XMLISO-8859-1字符集一起发送的原因:


  在HTTP / 1.1的早期版本中,定义了默认字符集(ISO-8859-1)。情况不再如此,现在每种内容类型都可以具有自己的默认值。


无论如何,如果您使用的此api服务不支持Accept-Charset,则可以在将其存储到数据库之前自行转换编码。

添加:

将此响应内容转换为utf8是一件棘手的事情:流星的HTTP.call已将其作为utf8字符串返回,因此在response.content中,您已经将ISO-8859-1字符串视为utf8字符串。

您必须使用Buffer将其转换回:

data = Buffer.from(response.content, 'binary').toString('binary');


我已经使用此网址亲自对其进行了测试,并且可以正常工作。

关于javascript - 将ISO-8859-1 XML转换为UTF-8,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45786899/

10-09 21:23