从 unicode 字符串创建数据 URI

Making a data URI from unicode string

我正在尝试 JavaScript 下载 unicode 字符串作为文本文件。我现在需要将 unicode 字符串转换为数据 URL,以便用户可以打开 URL 并下载文件。 这是我的代码的简化:

var myString = "⌀怴ꁴ㥍䯖챻巏ܛ肜怄셀겗孉贜짥孍ಽ펾曍㩜䝺捄칡⡴얳锭劽嫍ᯕ�";

var link = document.createElement('a');
link.setAttribute('href', 'data:text/plain;base64,' + myString);

我不知道要使用什么字符集或如何对我的字符串进行编码 - 我尝试了 encodeURI()btoa() 的组合,但没有成功。 encodeURI() 给了我 Uncaught URI Error: malformed URI 一些字符的错误 U+da7b.
我希望最终下载的文件具有与初始字符串相同的字符。

您可以尝试设置下载属性并使用 URL encoding with text/plain

const myString = '⌀怴ꁴ㥍䯖챻巏ܛ肜怄셀겗孉贜짥孍ಽ펾曍㩜䝺捄칡⡴얳锭劽嫍ᯕ�';

const link = document.createElement('a');
link.setAttribute('download', 'filename');
link.append("Download!");
link.setAttribute('href', 'data:,' + encodeURI(myString));

document.body.appendChild(link);

这对我有用

decodeURIComponent(atob(btoa(encodeURIComponent("中文"))))
// Output: 中文

对于您在 \uDA7B 上的案例,它失败了,因为它是高代理 (D800-DBFF) 之一,它仅在用作代理对的一部分时才有意义。

这就是为什么当你这样做时你有 URIError

encodeURIComponent('\uDA7B') // ERROR

将它与来自低代理 (DC00-DFFF) 的角色配对,它起作用了:

encodeURIComponent('\uDA7B\uDC01')

data: URL 中使用文本时不需要使用 base64,只需对文本进行百分比编码就足够了,例如:

var link = document.createElement('a');
link.setAttribute('href', 'data:text/plain;charset=UTF-8,' + encodeURIComponent(myString));

encodeURIComponent() 字符集将文本编码为 UTF-8,然后 url 将 UTF-8 字节编码,因此 charset=UTF-8 包含在 data: URL.

但是,如果您仍想使用 base64,则不需要对文本进行 url 编码。只需将文本字符集编码为字节,然后对字节进行 base64 编码,并指定 data: URL 中使用的字符集,例如:

var link = document.createElement('a');
link.setAttribute('href', 'data:text/plain;charset=UTF-8;base64,' + btoa(unescape(encodeURIComponent(myString))));