Axios 的编码问题
Encoding issue with Axios
我正在使用 axios 获取网页,但响应的内容类型是 ISO-8859-1,而 axios 给出的结果似乎将其解析为 UTF-8 和结果有损坏的字符。
我尝试转换结果编码但没有任何效果,我认为这不是因为 this
例如在 got 库中我可以将编码设置为 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 包对其进行解码。
在 this github issue Matt Zabriskie recommends using an 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;
})
在没有使用拦截器或其他包的情况下,我在缓冲区上得到了响应:
notifications = await axios.request({
method: 'GET',
url: Link,
responseType: 'arraybuffer',
reponseEncoding: 'binary'
});
接下来将其转换为:
let html = notifications.data.toString('latin1');
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)
我正在使用 axios 获取网页,但响应的内容类型是 ISO-8859-1,而 axios 给出的结果似乎将其解析为 UTF-8 和结果有损坏的字符。
我尝试转换结果编码但没有任何效果,我认为这不是因为 this
例如在 got 库中我可以将编码设置为 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 包对其进行解码。
在 this github issue Matt Zabriskie recommends using an 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;
})
在没有使用拦截器或其他包的情况下,我在缓冲区上得到了响应:
notifications = await axios.request({
method: 'GET',
url: Link,
responseType: 'arraybuffer',
reponseEncoding: 'binary'
});
接下来将其转换为:
let html = notifications.data.toString('latin1');
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)