2012-01-18 30 views
7

Tôi sắp viết trình tìm nạp nguồn cấp dữ liệu RSS và bị kẹt với một số vấn đề về ký tự.Phản hồi được mã hóa http.get và ISO-8859-1

Tải và phân tích cú pháp nguồn cấp dữ liệu khá dễ dàng so với mã hóa. Tôi đang tải nguồn cấp dữ liệu với http.get và tôi đang đặt các khối với nhau trên mọi sự kiện dữ liệu. Sau đó tôi phân tích cú pháp toàn bộ chuỗi bằng npm-lib feedparser hoạt động tốt với chuỗi đã cho.

Rất tiếc, tôi đã quen với các chức năng như utf8_encode() trong php và tôi thiếu chúng trong node.js vì vậy tôi bị kẹt với việc sử dụng Iconv hiện không làm những gì tôi muốn.

Nếu không mã hóa có một số utf8 -icons cho charset sai, với iconv, chuỗi được phân tách sai:/

Hiện nay tôi đang mã hóa tất cả các chuỗi seperatedly:

//var encoding ≈ ISO-8859-1 etc. (Is the right one, checked with docs etc.) 
// Shortend version 

var iconv = new Iconv(encoding, 'UTF-8'); 

parser.on('article', function(article){ 
    var object = { 
     title : iconv.convert(article.title).toString('UTF-8'), 
     description : iconv.convert(article.summary).toString('UTF-8') 
    } 
    Articles.push(object); 
}); 

Tôi nên bắt đầu mã hóa với bộ đệm dữ liệu hoặc sau đó với chuỗi hoàn chỉnh?

Cảm ơn bạn!

PS: Encoding được xác định với phân tích cú pháp người đứng đầu xml

Làm thế nào về một module mà làm cho mã hóa trong Node.js dễ dàng hơn?

+0

phải là những gì bạn đã không làm việc? – loganfsmyth

+0

Tôi không thể nhận mã hóa biểu tượng đúng – moe

+0

Vì vậy, các đối tượng bài viết không được mã hóa chính xác và thay vào đó chứa rác? Và bạn có thể hiển thị nguồn cấp dữ liệu không? – fent

Trả lời

9

Có thể bạn đang gặp phải sự cố tương tự được mô tả trên https://groups.google.com/group/nodejs/browse_thread/thread/b2603afa31aada9c.

Giải pháp có vẻ là đặt mã hóa phản hồi thành nhị phân trước khi xử lý Bộ đệm với Iconv.

Các bit có liên quan là

bộ response.setEncoding ('nhị phân') và tổng hợp các khối vào một bộ đệm trước khi gọi Iconv.convert(). Lưu ý rằng mã hóa = nhị phân có nghĩa là dữ liệu của bạn gọi lại sẽ nhận được các đối tượng đệm, không phải chuỗi.


Cập nhật: này đã phản ứng ban đầu của tôi

Bạn có chắc chắn rằng các thức ăn bạn đang nhận đã được mã hóa một cách chính xác?

Tôi có thể thấy hai lỗi có thể:

  1. thức ăn đã được gửi đi với dữ liệu Latin-1-mã hóa, nhưng với một Content-Type mà các tiểu bang charset=UTF-8.
  2. nguồn cấp dữ liệu đang được gửi với dữ liệu được mã hóa UTF-8 nhưng tiêu đề Content-Type không nêu rõ bất kỳ điều gì, mặc định là ASCII.

Bạn nên kiểm tra nội dung của nguồn cấp dữ liệu của mình và các tiêu đề đã gửi với một số tiện ích như Wireshark hoặc cURL.

+0

im làm việc với moe- nguồn là http : //www.spiegel.de/schlagzeilen/tops/index.rss –

+0

Tôi khá chắc chắn rằng nội dung được mã hoá ISO-8859-1. Content-Header và tiêu đề của xml-file match. – moe

+0

Thực tế nó có vẻ được mã hóa chính xác. Tôi đã cập nhật câu trả lời của mình để đề xuất giải pháp khác. – gioele

1

Tôi nghĩ rằng vấn đề có thể là do cách bạn lưu trữ dữ liệu trước khi bạn chuyển nó đến feedparser.Thật khó để nói mà không thấy trình xử lý sự kiện dữ liệu của bạn, nhưng tôi sẽ đoán rằng bạn đang làm điều gì đó như sau:

values = ''; 
stream.on('data', function(chunk){ 
    values += chunk; 
}); 

Đúng không?

Vấn đề là trong trường hợp này, đoạn là bộ đệm và bằng cách sử dụng '+' để nối tất cả lại với nhau, bạn ngầm chuyển đổi bộ đệm thành chuỗi.

Nhìn sâu hơn vào đó, bạn thực sự đang thực hiện chuyển đổi iconv trên toàn bộ nguồn cấp dữ liệu, trước khi chạy nó thông qua feedparser, bởi vì feedparser có thể không biết các mã hóa khác.

Hãy thử một cái gì đó như thế này:

var iconv = new Iconv('ISO-8859-1', 'UTF8'); 
var chunks = []; 
var totallength = 0; 
stream.on('data', function(chunk) { 
    chunks.push(chunk); 
    totallength += chunk.length; 
}); 
stream.on('end', function() { 
    var results = new Buffer(totallength); 
    var pos = 0; 
    for (var i = 0; i < chunks.length; i++) { 
    chunks[i].copy(results, pos); 
    pos += chunks[i].length; 
    } 
    var converted = iconv.convert(results); 
    parser.parseString(converted.toString('utf8')); 
}); 
Các vấn đề liên quan