Javascript 下载XML提要时处理多种编码方案

Javascript 下载XML提要时处理多种编码方案,javascript,node.js,xml,encoding,httprequest,Javascript,Node.js,Xml,Encoding,Httprequest,我正在尝试通过以下URL读取提要: http://www.chinanews.com/rss/scroll-news.xml 使用。但我得到的东西有���� ʷ����)������(�й�)���޹� 查看XML时,我看到编码被设置为 但是在尝试将编码设置为gb2312时,我得到了未知的编码错误 request({ url: "http://www.chinanews.com/rss/scroll-news.xml", method: "GET", headers:

我正在尝试通过以下URL读取提要:

http://www.chinanews.com/rss/scroll-news.xml
使用。但我得到的东西有
���� ʷ����)������(�й�)���޹�

查看
XML
时,我看到编码被设置为

但是在尝试将编码设置为gb2312时,我得到了未知的编码错误

request({
    url: "http://www.chinanews.com/rss/scroll-news.xml",
    method: "GET",
    headers: {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate",
        "Host": "www.chinanews.com",
        "Accept-Language": "en-GB,en-US;q=0.8,en;q=0.6"
    },
    "gzip": true,
    "encoding": "utf8"
}, (err, resp, data) => {
    console.log(data);
});
有没有一种方法可以不考虑数据的编码而获取数据?我应该如何处理?您错过了数据的概念

chunk
是node.js中的一个
缓冲区
实例。据官方称,只有

  • “ascii”-仅用于7位ascii数据。此编码速度快,如果设置,将去除高位

  • “utf8”-多字节编码的Unicode字符。许多网页和其他文档格式使用UTF-8

  • “utf16le”-2或4字节,小尾端编码的Unicode字符。支持代理项对(U+10000到U+10FFFF)

  • “ucs2”-“utf16le”的别名

  • “base64”-base64编码。当从字符串创建缓冲区时,此编码还将正确接受RFC4648第5节中指定的“URL和文件名安全字母表”

  • “latin1”-将缓冲区编码为单字节编码字符串的一种方式(如RFC1345第63页IANA中的定义,为拉丁语-1补充块和C0/C1控制代码)

  • “binary”-“latin1”的别名

  • “十六进制”-将每个字节编码为两个十六进制字符

当前由node.js包含。若要使用node.js不支持的编码,请使用或获取字符映射表。这与非常类似

Accept Language
表示客户接受的语言。
en gb
表示
英语(英国)
,但不是中文。根据RFC 7231,中文是
zh cn,zh

您错过了

chunk
是node.js中的一个
缓冲区
实例。据官方称,只有

  • “ascii”-仅用于7位ascii数据。此编码速度快,如果设置,将去除高位

  • “utf8”-多字节编码的Unicode字符。许多网页和其他文档格式使用UTF-8

  • “utf16le”-2或4字节,小尾端编码的Unicode字符。支持代理项对(U+10000到U+10FFFF)

  • “ucs2”-“utf16le”的别名

  • “base64”-base64编码。当从字符串创建缓冲区时,此编码还将正确接受RFC4648第5节中指定的“URL和文件名安全字母表”

  • “latin1”-将缓冲区编码为单字节编码字符串的一种方式(如RFC1345第63页IANA中的定义,为拉丁语-1补充块和C0/C1控制代码)

  • “binary”-“latin1”的别名

  • “十六进制”-将每个字节编码为两个十六进制字符

当前由node.js包含。若要使用node.js不支持的编码,请使用或获取字符映射表。这与非常类似


Accept Language
表示客户端接受的语言。
en gb
表示
英语(英国)
,但不是中文。根据RFC 7231,中文是
zh cn,zh

棘手的部分是将编码传递为null以获得缓冲区而不是字符串

encoding
-用于响应数据的setEncoding的编码。 如果
null
,则主体将作为
缓冲区返回

-


同样,在后续问题中,“

有没有办法检测编码?”

我希望您所说的“检测”是指找到声明。(…与猜测相反。如果必须猜测,则通信失败。)HTTP响应头内容类型是通信编码的主要方式(如果适用于MIME类型)。某些MIME类型允许在内容中声明编码,因为服务器完全正确地遵循了这一点

在RSS响应的情况下。服务器发送
内容类型:text/xml
。这没有编码覆盖。内容的xml声明是
。xml规范有查找此类声明的过程。它基本上相当于使用不同的编码进行读取,直到xml声明变为intelligi,然后使用声明的编码重新读取

var request = require('request');
var legacy = require('legacy-encoding');
var convert = require('xml-js');

// specials listed here: https://www.w3.org/Protocols/rfc1341/4_Content-Type.html
var charsetFromContentTypeRegex = (/charset=([^()<>@,;:\"/[\]?.=\s]*)/i).compile(); 

var requestSettings = {
    method: 'GET',
    url: 'http://www.chinanews.com/rss/scroll-news.xml',
    encoding: null,
};


request(requestSettings, function(error, response, body) {    
    var contentType = charsetFromContentTypeRegex.exec(response.headers['content-type'])
    var encodingFromHeader = contentType.length > 1 ? contentType[1] : null;

    var doc = convert.xml2js(body);
    var encoding = doc.declaration.attributes.encoding;
    doc = convert.xml2js(
        legacy.decode(body, encodingFromHeader ? encodingFromHeader : encoding));
    // xpath /rss/channel/title
    console.log(doc.elements[1].elements[0].elements[0].elements[0].text); 
});
var request=require('request');
var legacy=require(‘legacy-encoding’);
var convert=require('xml-js');
//这里列出的特色菜:https://www.w3.org/Protocols/rfc1341/4_Content-Type.html
var charsetFromContentTypeRegex=(/charset=([^()@,;:\“/[\]?。=\s]*)/i).compile();
var请求设置={
方法:“GET”,
网址:'http://www.chinanews.com/rss/scroll-news.xml',
编码:空,
};
请求(请求设置、函数(错误、响应、正文){
var contentType=charsetFromContentTypeRegex.exec(response.headers['content-type'])
var encodingFromHeader=contentType.length>1?contentType[1]:null;
var doc=convert.xml2js(body);
var encoding=doc.declaration.attributes.encoding;
doc=convert.xml2js(
解码(正文,encodingFromHeader?encodingFromHeader:encoding));
//xpath/rss/channel/title
console.log(doc.elements[1]。elements[0]。elements[0]。elements[0]。text);
});

棘手的部分是将编码传递为null以获取缓冲区而不是字符串

encoding
-用于响应数据的setEncoding的编码。 如果
null
,则主体将作为
缓冲区返回

-


同样,在后续问题中,“

有没有办法检测编码?”

我希望你说的“发现”是指发现
var request = require('request');
var legacy = require('legacy-encoding');


var requestSettings = {
    method: 'GET',
    url: 'http://www.chinanews.com/rss/scroll-news.xml',
    encoding: null,
};

request(requestSettings, function(error, response, body) {    
    var text = legacy.decode(body, 'gb2312');    
    console.log(text);
});
var request = require('request');
var legacy = require('legacy-encoding');
var convert = require('xml-js');

// specials listed here: https://www.w3.org/Protocols/rfc1341/4_Content-Type.html
var charsetFromContentTypeRegex = (/charset=([^()<>@,;:\"/[\]?.=\s]*)/i).compile(); 

var requestSettings = {
    method: 'GET',
    url: 'http://www.chinanews.com/rss/scroll-news.xml',
    encoding: null,
};


request(requestSettings, function(error, response, body) {    
    var contentType = charsetFromContentTypeRegex.exec(response.headers['content-type'])
    var encodingFromHeader = contentType.length > 1 ? contentType[1] : null;

    var doc = convert.xml2js(body);
    var encoding = doc.declaration.attributes.encoding;
    doc = convert.xml2js(
        legacy.decode(body, encodingFromHeader ? encodingFromHeader : encoding));
    // xpath /rss/channel/title
    console.log(doc.elements[1].elements[0].elements[0].elements[0].text); 
});