2012-11-19 64 views
5

我想用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),但似乎沒有任何工作正確。使用node.js從windows-1250編碼的網頁獲取正確的字符串

你可以看到這裏https://gist.github.com/4110999整個代碼。

我想我缺少關於編碼如何工作的一些基本知識,所以如何獲得正確的字符數據的任何幫助將不勝感激。

編輯:
還試過node-iconv包,以防萬一它是包問題。將第51行更改爲:

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

但仍得到相同的結果。

回答

1

我不熟悉的iconv-精簡版包,但期待通過它的代碼,它看起來像你需要使用win1250代替windows1250(見here

的編碼有擡頭爲a hash

此外,自述使用此代碼,而不是「windows1251」:

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

您好,我還通過代碼去,似乎編碼被組織成同義詞1250 == win1250 == windows1250。無論如何我都嘗試過,它給出了相同的結果。 win1251也不起作用,結果是不同的,但非ASCII字符仍然是胡言亂語。 – aocenas

0

我認爲,要轉換的字符串,但你必須轉換一個原始字節! 如果(你正在閱讀從網上的東西,你必須把它讀作二進制)從磁盤中互利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(); 
相關問題