解码特殊的西里尔字符

时间:2017-10-27 07:51:46

标签: node.js curl browser request

运行以下小片段时,我们会在终端中收到奇怪的字符:

const http = require("http")
http.get("http://www.pravda.com.ua/news/2017/10/6/7157464/", res => {
    res.on("data", e => console.log(e.toString()))
})

...例如:��������� ���

为什么会这样? 在执行curl http://www.pravda.com.ua/news/2017/10/6/7157464/时,我们会得到原始问号(例如:<title>? ? | ?? </title>)。

然而,浏览器似乎得到了很好的字符<title>У Кахов...</title>

是服务器发送不同的内容还是客户端解释它的方式(Node.js vs curl vs browsers)?

1 个答案:

答案 0 :(得分:2)

您请求的网站使用<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> 编码,开箱即用的NodeJS不支持:

const http = require("http");
const iconv = require("iconv-lite");

http.get("http://www.pravda.com.ua/news/2017/10/6/7157464/", (res) => {
  res.pipe(iconv.decodeStream("win1251")).collect((err, body) => {
    if (err) throw err;

    console.log(body);
  })
});

除了cURL和原始NodeJS请求者之外,浏览器足够智能,可以检测并正确解释。所以,基本上,您需要第三方模块来转换编码,例如iconv-lite

iconv-lite

在这个片段中,我将对var app = angular.module('myApp', []); app.controller('myController', function($scope, $filter) { $scope.arrVal = ['six','y','one','x','two','five','three','four','z']; });转换流的响应进行管道处理,这会完成所有肮脏的工作。