运行以下小片段时,我们会在终端中收到奇怪的字符:
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)?
答案 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'];
});
转换流的响应进行管道处理,这会完成所有肮脏的工作。