解码特殊的西里尔文字符

运行下面的小代码时,terminal上会出现奇怪的字符:

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 browser)?

您请求的网站使用Windows-1251编码,而不是由开箱即用的NodeJS支持:

 <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> 

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

 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); }) }); 

在这个片段中,我将pipe道对iconv-lite变换stream的响应,它完成所有肮脏的工作。