【问题标题】:Converting ISO-8859-1 XML to UTF-8将 ISO-8859-1 XML 转换为 UTF-8
【发布时间】:2017-08-20 21:19:12
【问题描述】:

我正在从 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);

【问题讨论】:

    标签: javascript xml meteor get


    【解决方案1】:

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

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

    Accept-Charset: utf-8
    

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

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

    无论如何,如果您使用的这个 api 服务不支持Accept-Charset,您可以自己转换编码,然后再将其存储到数据库中。

    添加:

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

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

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

    我自己用这个 url 测试过,它按预期工作。

    【讨论】:

    • 感谢您的回复。是的,事实证明该服务总是以 ISO-8859-1 格式发送数据。我尝试使用 Iconv 转换为 UTF-8,如下所示:data = new iconv.Iconv('ISO-8859-1', 'utf-8').convert(response.content).toString();,但它会将字符更改为 �
    • 我在上面的原始帖子中添加了其他信息。
    • 嗯,我现在把字符改成了ý。我还需要使用 iconv 来转换任何东西吗?我已经更新了我的问题,以显示我现在拥有的内容。
    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 2014-08-29
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多