【问题标题】:Automatic UTF-8 encoding in Node.js HTTP clientNode.js HTTP 客户端中的自动 UTF-8 编码
【发布时间】:2011-04-11 03:27:05
【问题描述】:

我正在尝试使用 Node.js 从远程主机加载 XML 内容。

问题是像“ä”这样的德语“元音变音”被破坏了。就像在浏览器中一样,这通常是一个简单的编码问题。但由于远程主机上的 XML 内容是用 iso-8859-2 编码的”,我没有成功让这些字母恢复工作。

功能非常简单。我只是使用集成在 Node.js 中的默认 HTTP 客户端,通过简单的 get 请求连接到远程主机。

一些环境事实:

  • 远程系统使用“iso-8859-2”编码。
  • 当前在响应标头中设置了编码。
  • response.onData(chunk) 收到的数据(块)中的字符不可恢复损坏

Node.js 在默认 Debian 服务器上运行 0.2 版。

代码基于 Node.js 文档中描述的默认 httpClient。

我尝试了以下方法:

response.defaultAsciiEncoding true/false
response.encoding = UFT-8/ascii

我使用 UTF-8 编码器/解码器对块进行编码/解码。失败后,我尝试对整个响应正文进行编码/解码。

我对使用缓冲区不是很熟悉,我想问题一定是在那个方向上。或者 Node.js(或 httpClient)在默认情况下根本无法处理其他编码类型,这是我的第二个猜测。在这种情况下,我需要使用我认为的 net lib 编写自己的 HTTP 客户端。我只是想确保我不会走错方向:)

【问题讨论】:

    标签: xml encoding response httpclient node.js


    【解决方案1】:

    尝试在 XML 声明中设置编码参数:

    <?xml version="1.0" encoding="iso-8859-2" ?>
    <xml>
      <!-- whatever -->
    </xml>
    

    除非您明确声明它们的编码,否则 XML 文件默认为 UTF-8。

    【讨论】:

    • 远程源是动态的,不受我控制。但是是的,xml 版本和编码已设置。我将 sampleResponse 上传到我的服务器。我也可以添加一个 node.js 脚本来重现错误。示例位置是node.geht-ab.net/original.html
    • @age:不确定这应该是什么?它以 text/html 形式提供,没有编码参数。
    • 是的,对不起,我忘记了,所以正确模拟了标题。 node.geht-ab.net/original.php 我刚刚添加了 Content-type 标头。只是 xml 的 doctype 设置为 iso-8859-1 响应本身没有编码信息。以下是原文: Connection:keep-alive Content-Length:181706 Content-Type:text/xml Date:Sun, 12 Sep 2010 02:43:40 GMT Server:Apache
    【解决方案2】:

    在我看来,Node.js 不能使用 UTF-8 以外的编码。也许使用node-iconv 之类的东西应该可以工作。

    【讨论】:

    • 这里的问题是,我找不到访问原始数据的点/事件。他们在 response.onData(chunk) 上让我很感动。我可能会检查 node.js 库以了解发生了什么。但是如果我在端口 80 上使用 net.socket。你发现的绑定没有用。
    【解决方案3】:

    我快速浏览了 Node.js 源代码,似乎 svick 是对的:Node.js 不支持 ISO 编码。但是,您可以将响应作为二进制流获取,然后使用您自己的编码将其返回到浏览器或使用 node-iconv(再次按照 svick 的建议)。

    这是一个小例子:http://gist.github.com/576884

    【讨论】:

    • response.setEncoding("binary");我不敢相信我没有尝试过的伎俩。不知何故,我只在这里尝试使用 ascii。对于一个快速原型,我使用了 php.js utf8_encode。完美运行。感谢您的回答和 iconv 绑定的链接。
    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2011-04-09
    • 2017-08-23
    相关资源
    最近更新 更多