使用node.js从windows-1250编码的网页获取正确的字符串

时间:2012-11-19 14:55:34

标签: javascript node.js character-encoding

我正在尝试使用nodejs从webpage中抓取一些数据,但我遇到了字符编码问题。 该网页声明它的编码是: <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> 当我用chrome浏览它时,它将编码设置为windows-1250,一切看起来都很好。

由于节点中的流没有windows-1250编码/解码(并且utf8不起作用),我发现了一个iconv-lite包,它应该能够轻松地在不同的编码之间进行转换。但是在将响应保存到文件(或输出到控制台)后,我仍然会收到错误的字符。我也尝试了不同的编码,本机节点缓冲区编码,设置标题与我在chrome(Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3)中看到的相同,但似乎没有任何工作正常。

您可以在此处查看整个代码https://gist.github.com/4110999

我想我遗漏了一些关于编码如何工作的基本信息,所以对于如何使用正确的字符获取数据的任何帮助都将不胜感激。

编辑:
还尝试了node-iconv包,以防它出现包问题。将第51行更改为:

var decoder = new Iconv_native('WINDOWS-1250', 'UTF-8');  
var decoded = decoder.convert(body).toString();

但仍然得到相同的结果。

2 个答案:

答案 0 :(得分:1)

我不熟悉iconv-lite软件包,但查看它的代码,看起来你需要使用win1250代替windows1250(参见here

编码被查询为a hash

此外,自述文件使用此代码而不是'windows1251':

str = iconv.decode(buf, 'win1251');

答案 1 :(得分:0)

我认为,您正在转换字符串,但必须转换原始字节! 如果(您正在从网上阅读某些内容,则必须将其读作二进制文件)

从磁盘读取win-1250中的文件示例:

var Buffer = require('buffer').Buffer;
var Iconv = require('iconv').Iconv; 

//without options (encoding is not specified), 'fs' reads as raw bytes.
var bytes= fs.readFileSync('myFile.txt'); 
//this is bad: var myBadString = fs.readFileSync('myFile.txt', { encoding: "UTF-8" });

var buf = new Buffer(bytes, 'binary');
var translated = new Iconv('CP1250', 'UTF8').convert(buf).toString();