2012-11-19 5 views
5

Próbuję zeskanować niektóre dane z webpage z nodejs, ale mam problemy z kodowaniem znaków. Strona podaje, że kodowanie to: <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> A kiedy przeglądam to z chromem, ustawia kodowanie na Windows-1250 i wszystko wygląda dobrze.Uzyskiwanie poprawnego ciągu z zakodowanej strony Windows-1250 za pomocą node.js

Ponieważ nie ma kodowania/dekodowania windows-1250 dla strumieni w węźle (i utf8 nie działało), znalazłem pakiet iconv-lite, który powinien być w stanie łatwo konwertować pomiędzy różnymi kodowaniami. Ale nadal otrzymuję błędne znaki po zapisaniu odpowiedzi w pliku (lub wyprowadzeniu na konsolę). Próbowałem także różnych kodowań, kodowania buforów macierzystych węzłów, ustawiając nagłówki na takie same, jak to, co widzę w chrome (Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3), ale nic nie działa poprawnie.

Możesz zobaczyć cały kod tutaj https://gist.github.com/4110999.

Przypuszczam, że brakuje mi czegoś podstawowego co do sposobu kodowania, więc pomoc w uzyskaniu danych z poprawnymi znakami byłaby doceniana.

EDYTOWANIE:
Próbowano również pakiet node-iconv w przypadku, gdy jest to problem z pakietem. Zmieniono linię 51 na:

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

ale nadal uzyskuję takie same wyniki.

Odpowiedz

1

nie jestem zaznajomiony z pakietem iconv-lite, ale patrząc przez jego kod, wygląda na to trzeba użyć win1250 zamiast windows1250 (patrz here)

Do kodowania są spojrzał jako a hash .

Również readme wykorzystuje ten kod zamiast „windows-1251”:

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

Hi, I udał się za pomocą kodu i wydaje się, że kodowania są zorganizowane jako synonimy, więc 1250 == win1250 == Windows1250. Próbowałem to mimo wszystko i daje takie same wyniki. win1251 też nie działa, wynik jest inny, ale znaki spoza ASCII nadal są bełkotem. – aocenas

0

myślę, konwertowania ciąg, ale musi przekonwertować surowe bajty! Jeśli (czytasz coś z sieci, należy go rozumieć jako binarny)

Przykład odczytu pliku w Win-1250 z dysku:

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(); 
Powiązane problemy