获取响应的编码转换
Encoding conversion of a fetch response
在 React Native 方法中,我正在获取以 ISO-8859-1 编码的 xml。
只要抓取完成,我就会尝试将其转换为 UTF-8。
这里是代码:
const iconv = require('iconv-lite');
fetch('http://www.band.uol.com.br/rss/colunista_64.xml', {
headers: {
"Content-type": "text/xml; charset=ISO-8859-1"
}
})
.then(res=>res.text()})
.then(text => {
const decodedText = iconv.decode(Buffer.from(text, 'latin1'), 'latin1')
, output = iconv.encode(decodedText, 'utf8')
console.log(output.toString())
})
问题是:正文的所有特殊字符都被替换为“¿½”
对于转换,我使用的是包 iconv-lite
这个问题更好的解决方法是什么?
最好的解决方法是使用 res.arrayBuffer()
而不是 res.text()
,只要 Buffer 构造函数接受 ArrayBuffer
代码:
fetch('http://www.band.uol.com.br/rss/colunista_64.xml')
.then(res => res.arrayBuffer())
.then(arrayBuffer => iconv.decode(new Buffer(arrayBuffer), 'iso-8859-1').toString())
.then(converted => console.log(converted))
正如 Hellon Canella Machado 所指出的,您不能使用 res.text()
并且必须使用 ArrayBuffer 作为解决方法。
由于 res.arrayBuffer()
在 React Native 中无法使用 fetch,您可以使用 XMLHttpRequest API.
import iconv from 'iconv-lite';
import { Buffer } from 'buffer';
function fetchXML() {
return new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.onload = () => {
if (request.status === 200) {
resolve(iconv.decode(Buffer.from(request.response), 'iso-8859-1'));
} else {
reject(new Error(request.statusText));
}
};
request.onerror = () => reject(new Error(request.statusText));
request.responseType = 'arraybuffer';
request.open('GET', 'http://www.band.uol.com.br/rss/colunista_64.xml');
request.setRequestHeader('Content-type', 'text/xml; charset=ISO-8859-1');
request.send();
});
}
fetchXML().then(response =>
console.log(response)
);
还要确保安装了软件包 buffer
和 stream
。
let axiosConfig = {
responseType: 'arraybuffer',
responseEncoding: 'binary',
}
const htmlPage = await axios.get(`http://www.band.uol.com.br/rss/colunista_64.xml`, axiosConfig);
const decoder = new TextDecoder('iso-8859-1');
decoder.decode(pageHtml.data)
在 React Native 方法中,我正在获取以 ISO-8859-1 编码的 xml。
只要抓取完成,我就会尝试将其转换为 UTF-8。
这里是代码:
const iconv = require('iconv-lite');
fetch('http://www.band.uol.com.br/rss/colunista_64.xml', {
headers: {
"Content-type": "text/xml; charset=ISO-8859-1"
}
})
.then(res=>res.text()})
.then(text => {
const decodedText = iconv.decode(Buffer.from(text, 'latin1'), 'latin1')
, output = iconv.encode(decodedText, 'utf8')
console.log(output.toString())
})
问题是:正文的所有特殊字符都被替换为“¿½”
对于转换,我使用的是包 iconv-lite
这个问题更好的解决方法是什么?
最好的解决方法是使用 res.arrayBuffer()
而不是 res.text()
,只要 Buffer 构造函数接受 ArrayBuffer
代码:
fetch('http://www.band.uol.com.br/rss/colunista_64.xml')
.then(res => res.arrayBuffer())
.then(arrayBuffer => iconv.decode(new Buffer(arrayBuffer), 'iso-8859-1').toString())
.then(converted => console.log(converted))
正如 Hellon Canella Machado 所指出的,您不能使用 res.text()
并且必须使用 ArrayBuffer 作为解决方法。
由于 res.arrayBuffer()
在 React Native 中无法使用 fetch,您可以使用 XMLHttpRequest API.
import iconv from 'iconv-lite';
import { Buffer } from 'buffer';
function fetchXML() {
return new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.onload = () => {
if (request.status === 200) {
resolve(iconv.decode(Buffer.from(request.response), 'iso-8859-1'));
} else {
reject(new Error(request.statusText));
}
};
request.onerror = () => reject(new Error(request.statusText));
request.responseType = 'arraybuffer';
request.open('GET', 'http://www.band.uol.com.br/rss/colunista_64.xml');
request.setRequestHeader('Content-type', 'text/xml; charset=ISO-8859-1');
request.send();
});
}
fetchXML().then(response =>
console.log(response)
);
还要确保安装了软件包 buffer
和 stream
。
let axiosConfig = {
responseType: 'arraybuffer',
responseEncoding: 'binary',
}
const htmlPage = await axios.get(`http://www.band.uol.com.br/rss/colunista_64.xml`, axiosConfig);
const decoder = new TextDecoder('iso-8859-1');
decoder.decode(pageHtml.data)