【问题标题】:Javascript download binary data without base64Javascript下载没有base64的二进制数据
【发布时间】:2019-09-03 05:09:34
【问题描述】:

我想下载一些二进制数据,但 Chrome 将其强制为 utf-8,这会弄乱字节。如果我将 href 设置为数据 URI 并使用 base64 编码,它可以工作,但我想避免这种情况并改用 BLOB。

有没有办法阻止 Chrome 将此二进制数据转换为 utf-8?

const data = "\x00\xff\xfe\xe2"
console.log(data)
const file = new Blob([data])

const a = document.getElementById("a")
const url = URL.createObjectURL(file)
a.href = url;
a.download = "test.txt";
<a id="a">Download</a>

在这个例子中,你可以看到我的字符串包含字节

00 ff fe e2

然后我将该字符串转换为 blob。但是当你在 Chrome 中下载文件并再次查看字节时,你会发现

20 c3 bf c3 be c3 a2

相反。 我认为正在发生的是 chrome 获取每个字节,将其读取为 utf-16 并将其转换为 utf-8。例如,fe 在读取为 utf-16 时为 þ,但在 utf-8 中为 c3 be

【问题讨论】:

    标签: javascript


    【解决方案1】:

    Blob 构造函数将字符串隐式编码为 UTF-8,因此请改为传递类型化数组,例如 Uint8Array:

    const data = "\x00\xff\xfe\xe2"
    console.log(data)
    const file = new Blob([Uint8Array.from(data, c => c.charCodeAt(0))])
    
    const a = document.getElementById("a")
    const url = URL.createObjectURL(file)
    a.href = url;
    a.download = "test.txt";
    <a id="a">Download</a>

    【讨论】:

    • MDN 确实提到了DOMStrings are encoded as UTF-8,但我从没想过 Blob 会重新编码字符串,因为 Blob 用于二进制数据。让我很困惑的是,Blob 用 UTF-8 BOM EF BB BF 替换了 UTF-16 BOM FE FF,并忽略了现有的 UTF-8 BOM。 MIME 类型也无关紧要
    • @Wendelin blob 不明确用于二进制数据。它们的目的是表示内存中的文件,其中包括纯文本文件。 MIME 类型不影响编码,它只影响其他浏览器 API 在有多个可用选项时选择解释文件数据的方式(例如,当使用 Blob URI 作为<img>)
    猜你喜欢
    • 2017-07-14
    • 2015-11-15
    • 2012-06-14
    • 1970-01-01
    • 2020-07-31
    • 2016-02-18
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多