【发布时间】:2017-03-05 19:22:42
【问题描述】:
我正在获取一个带有axios 的网页,但响应的内容类型是 ISO-8859-1,而 axios 给出的结果似乎将其解析为 UTF-8,结果有损坏的字符.
我尝试转换结果编码但没有任何效果,我认为这不是因为this
例如在got库中我可以将encoding设置为null并解决这个问题,但是我想问你我可以用axios做什么来禁用自动编码或更改它?
【问题讨论】:
我正在获取一个带有axios 的网页,但响应的内容类型是 ISO-8859-1,而 axios 给出的结果似乎将其解析为 UTF-8,结果有损坏的字符.
我尝试转换结果编码但没有任何效果,我认为这不是因为this
例如在got库中我可以将encoding设置为null并解决这个问题,但是我想问你我可以用axios做什么来禁用自动编码或更改它?
【问题讨论】:
我的做法是这样的:
responseType 和responseEncoding 设置如下请求const response = await axios.request({
method: 'GET',
url: 'https://www.example.com',
responseType: 'arraybuffer',
responseEncoding: 'binary'
});
reponse.data 解码为所需格式let html = iso88592.decode(response.data.toString('binary'));
注意:就我而言,我需要使用this 包对其进行解码。
【讨论】:
responseType和responseEncoding后,您可以将response.data传递给fs.writeFile()
没有使用拦截器或其他包,我在缓冲区上得到响应:
notifications = await axios.request({
method: 'GET',
url: Link,
responseType: 'arraybuffer',
reponseEncoding: 'binary'
});
接下来将其转换为:
let html = notifications.data.toString('latin1');
【讨论】:
在this github issue Matt Zabriskie 建议使用axios response interceptor,我认为这是最干净的选择。
axios.interceptors.response.use(response => {
let ctype = response.headers["content-type"];
if (ctype.includes("charset=ISO-8859-1")) {
response.data = iconv.decode(response.data, 'ISO-8859-1');
}
return response;
})
【讨论】:
const notifications = await axios.request({
method: 'GET',
url: 'https://...your link',
responseType: 'arraybuffer',
reponseEncoding: 'binary'
});
const decoder = new TextDecoder('ISO-8859-1');
let html = decoder.decode(notifications.data)
【讨论】: