如何将javascript对象转换为utf-8 Blob进行下载?

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)

Kai*_*ido 6

调用new Blob([DOMString])会自动将您的DOMString (UTF-16) 转换为 UTF-8。

\n

所以你所需要的就是new Blob( [JSON.stringify(obj)] ).

\n

\r\n
\r\n
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
\r\n
\r\n

\n


Ber*_*rgi 5

您的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)

  • 我早些想念它,但是DOMString到UTF-8的转换是由new Blob([DOMString])隐式完成的。 (2认同)