Lov*_*lop 0 javascript unicode encoding json blob
我一直在尝试找到一种可行的解决方案,但找不到。
我在javascript中有一个对象,其中有一些非英语字符。
我正在尝试以下代码将对象转换为Blob以供下载。
当我单击以下载内容时,在打开下载的JSON时,非英语字符变得乱七八糟。
这是一个像这样的简单对象: {name: "??????", last: "?????"}
function setJSONForDownload(obj) {
obj = obj || []; // obj is the array of objects with non-english characters
const length = obj.length;
if (length) {
const str = JSON.stringify(obj);
const data = encode( str );
const blob = new Blob( [ data ], {
type: "application/json;charset=utf-8"
});
const url = URL.createObjectURL( blob );
const downloadElem = document.getElementById('download');
downloadElem.innerText = `Download ${length} pages scraped`;
downloadElem.setAttribute( 'href', url );
downloadElem.setAttribute( 'download', 'data.json' );
}
else {
document.getElementById('download').innerText = `No data to download...`;
}
}
function encode (s) {
const out = [];
for ( let i = 0; i < s.length; i++ ) {
out[i] = s.charCodeAt(i);
}
return new Uint8Array(out);
}
Run Code Online (Sandbox Code Playgroud)
调用new Blob([DOMString])会自动将您的DOMString (UTF-16) 转换为 UTF-8。
所以你所需要的就是new Blob( [JSON.stringify(obj)] ).
setJSONForDownload([{ name: "\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9e\xd7\x99\xd7\xaa", last: "\xd7\xa8\xd7\xa2\xd7\xa0\xd7\xa0\xd7\x94"}]);\n\nfunction setJSONForDownload(obj) {\n obj = obj || [];\n const length = obj.length;\n if (length) {\n\n // DOMString\n const str = JSON.stringify(obj);\n // text/plain;UTF-8\n const blob = new Blob([str]);\n \n const url = URL.createObjectURL(blob);\n const downloadElem = document.getElementById(\'download\');\n downloadElem.innerText = `Download ${length} pages scraped`;\n downloadElem.setAttribute(\'href\', url);\n downloadElem.setAttribute(\'download\', \'data.json\');\n } else {\n document.getElementById(\'download\').innerText = `No data to download...`;\n }\n}Run Code Online (Sandbox Code Playgroud)\r\n<a id="download">dl</a>Run Code Online (Sandbox Code Playgroud)\r\n您的encode函数已损坏,因为它将字符代码转换为字节。不要尝试自己实现它,只需使用Encoding API即可:
const str = JSON.stringify(obj);
const bytes = new TextEncoder().encode(str);
const blob = new Blob([bytes], {
type: "application/json;charset=utf-8"
});
Run Code Online (Sandbox Code Playgroud)