【问题标题】:Preserve UTF-8 BOM in Browser Downloads在浏览器下载中保留 UTF-8 BOM
【发布时间】:2017-07-31 15:43:54
【问题描述】:

我有一个 JAX-RS REST-Service,它生成一个 CSV 文件并将其流式传输回浏览器。一切都设置为 UTF-8,所以我通过浏览器下载的文件也是一个有效的 UTF-8 文件(没有 BOM),它在 Notepad++、Sublime 等中向我显示了有效、可读的 UTF-8 变音符号等。

虽然在 Excel 中打开这样的文件会导致不可读的元音变音等,因为 Excel 显然试图用另一个字符集打开它(我猜是 CP-1252,但这并不重要)。

通过 Notepad++ 使用 BOM 保存文件并在 Excel 中重新打开它的效果很好。似乎检测 BOM 是 Excel 用于检测 UTF-8 的唯一方法。无论如何 - 我认为添加 BOM 会有所帮助...

做到了。结果相同。过了一会儿,我发现 BOM 在某些情况下会被删除:如果我在 BOM 之前添加任何字符,我可以在我的 Hex-Editor 中看到 BOM。删除该字符后,BOM 将不再存在。

当我继续通过 cURL 下载文件时,我真的很惊讶。 BOM 就在那里!在那之前,我认为这可能与我的应用程序、Content-Types、Encodigs、HTTP Headers 等有关 - 但它们似乎都很好。

现在,经过数小时尝试不同的事情,我有什么想法可以告诉浏览器保留 BOM 吗?我可以设置任何 HTTP 标头吗?由于 Chrome、Internet Explorer、Edge、Firefox 都删除了 BOM,这听起来有点像我的浏览器约定...

非常感谢您高度赞赏的帮助!

编辑:感谢 sideshowbarker 的回答,我找到了一种解决方法,方法是在内容前添加两个 BOM,因此在浏览器删除第一个 BOM 后会剩下一个 BOM。

【问题讨论】:

    标签: curl browser utf-8 jax-rs byte-order-mark


    【解决方案1】:

    解决方法(来自 cmets):由于只读取前三个字节,因此您可以在源文件前添加两个 BOM,这将导致下载的文件是带有 BOM 的有效 UTF-8。

    就 Excel 而言:根据https://stackoverflow.com/a/16766198/1143392 的答案,较新版本的 Excel(来自 Office 365)现在支持 UTF-8。

    就问题中描述的行为的原因而言:原因是,相关规范要求剥离 BOM,这就是浏览器所做的。也就是浏览器符合the UTF-8 decode algorithm in the Encoding spec的要求,就是这样:

    要对字节流进行 UTF-8 解码,请运行以下步骤:

    1. buffer为空字节序列。

    2. stream 中读取三个字节到 buffer

    3. 如果 buffer 不匹配 0xEF 0xBB 0xBF,则将 buffer 添加到 stream

    4. 输出为码位流。

    5. 使用 streamoutput 运行 UTF-8 的解码器。

    6. 返回输出

    第 3 步是导致 BOM 被剥离的原因。

    鉴于编码规范要求,我认为没有办法告诉浏览器保留 BOM。

    【讨论】:

    • 谢谢,这篇文章真的很有用,并让我找到了一些解决方法:因为只读取了前 3 个字节,我现在在内容前添加两个 BOM,这会产生有效的 UTF-8下载后的BOM文件。只是为了记录,我将使用该解决方法更新问题。
    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2011-07-21
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多