我设法逐字节读取文本文件,并通过input
元素和FileReader
将最终用户的计算机加载的文件的字符集从Windows-1251更改为Unicode。现在,我想通过fetch
对服务器中的文件执行相同的操作。有可能这样做吗? (fetch
会位于通过HTTP服务的页面中,而URL则是相对的,例如fetch("raw/graph_tab.txt")
。我并不是像使用{一样尝试直接从最终用户的计算机中读取文件。 {1}}字段和input
)。
大量工作代码('windows-1251.js'库由Mathias Bynens创建):
FileReader
答案 0 :(得分:2)
如果您要使用encoding
方法的FileReader.readAsText(Blob, encoding)
参数,则可以在响应的Content-Type
标头中设置charset
parameter。 / p>
如果由于某种原因无法执行此操作,则必须使用Response方法将Body.blob()对象消耗到Blob,然后将生成的 Blob 到FileReader。
否则,即使 Response 对象具有与 FileReader 类似的方法,text()
方法也不提供编码选项...
答案 1 :(得分:1)
您完全不需要进行此转换:您正在运行Web服务器,这显然不能正确识别文件的编码。它应该在返回的Content-Type
标头中正确标识它(例如:Content-Type: text/plain; charset=windows-1251
)。有关更多信息,请参见SO自己的Joel Spolsky的this article。
如果由于某些原因而无法执行此操作:您可以将文件读取为二进制文件,并在ArrayBuffer
响应中通过arrayBuffer
获得fetch
:
fetch("raw/graph_tab.txt")
.then(response => {
if (!response.ok) {
throw new Error(response.status);
}
return response.arrayBuffer();
})
.then(buffer => {
// ...convert it here...
})
.catch(error => {
// Handle/report error
});
那么问题是我们为...convert it here...
做些什么。 :-)您所引用的库期望得到一个“字节字符串”,我猜这与您从readAsBinaryString
的{{1}}方法获得的字节字符串相同。如果是这样,您可以将FileReader
转换为如下格式:
ArrayBuffer
所以:
const str = new Uint8Array(buffer).map(byte => String.fromCharCode(byte)).join("");