Javascript 下载XML提要时处理多种编码方案
我正在尝试通过以下URL读取提要: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:
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);
});