在浏览器下载中保留 UTF-8 BOM

2023-11-23

我有一个 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 之前添加任何字符,我可以在我的十六进制编辑器中看到 BOM。删除该字符后,BOM 将不再存在。

当我继续通过 cURL 下载该文件时,我真的很惊讶。 BOM 就在那里!在此之前,我认为这可能与我的应用程序、内容类型、编码、HTTP 标头等有关 - 但所有这些似乎都很好。

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

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

EDIT:感谢 sideshowbarker 的回答,我找到了一种解决方法,即在内容前面添加两个 BOM,这样在浏览器删除第一个 BOM 后,还会剩下一个 BOM。


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

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

至于问题中描述的行为原因:原因是,相关规范要求删除 BOM,而这就是浏览器所做的。也就是说,浏览器符合以下要求编码规范中的 UTF-8 解码算法,就是这样:

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

  1. Let buffer是一个空字节序列。

  2. 从中读取三个字节stream into buffer.

  3. If buffer与 0xEF 0xBB 0xBF 不匹配,前置buffer to stream.

  4. Let output是一个码点流。

  5. 运行 UTF-8 解码器stream and output.

  6. Return output.

步骤 3 导致 BOM 被剥离。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在浏览器下载中保留 UTF-8 BOM 的相关文章

  • 设置浏览器窗口最小化的最小尺寸限制?

    有没有办法在所有浏览器中手动设置浏览器窗口的最小尺寸 你可以试试 body min width 600px 一旦视口小于 600 像素 您将得到一个水平滚动条 这仅适用于支持 min width CSS 属性的现代浏览器 我认为不可能限制用
  • 如何重载比较器以使用 UTF-8 和不同区域设置进行排序

    我有一个数据集合 Alphabet Zend wiczenia 结果collection sort I get Alphabet Zend wiczenia 如何超载comparator使用 UTF 8 和不同的语言环境进行排序 你需要设置
  • 使用 API 和curl (POST/PATCH) 将视频上传到 Vimeo

    据我了解 可以使用curl来发出POST和PATCH请求 POST https gist github com subfuzion 08c5d85437d5d4f00e58 https gist github com subfuzion 0
  • PHP cURL 重定向到本地主机

    我正在尝试使用带有 cURL 的 php 脚本登录外部网页 我是 cURL 的新手 所以我觉得我错过了很多东西 我找到了几个例子并修改了它们以允许访问https页面 最终 我的目标是能够登录页面并在登录后通过指定的链接下载 csv 到目前为
  • 如何使用 gitlab-ci 中的变量在 Slack 通道中发送通知

    我正在向 gitlab ci 流程添加一个新阶段 以便在开始或结束新的释放部署时发送通知 我首先在 Slack 中创建传入 webhook 然后更新了gitlab ci yml file 这是子步骤将从中继承的父阶段 Slack stage
  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 布局引擎和javascript引擎的区别

    经过大量阅读 似乎当人们说浏览器引擎时 他们指的是诸如 gecko 或 webkit 之类的布局引擎 我还知道布局引擎基本上负责 绘制 屏幕 而javascript引擎则用于解释 但问题是 对于现代网络应用程序来说 哪一个对性能影响更大 这
  • 如果 CSS 是渲染阻塞的,为什么我们会看到 FOUC?

    为了构建渲染树 浏览器需要 DOM 和 CSSOM CSSOM 只有在下载 CSS 后才能构建 本质上 一旦下载了 CSS 页面就应该可以正常渲染了 但是 为什么我们会在页面上看到 Flash Of Unstyled Content FOU
  • 处理css浏览器兼容性的正确方法是什么?

    是为每个用户代理使用不同的 CSS 文件更好 还是使用只有某些浏览器才能看到的 CSS Hacks 更好 Neither 最好的方法是编写适用于所有浏览器的代码 而不需要特定于浏览器的代码或 CSS hack 当然 实现起来并不那么容易 这
  • 如何在c++中使用libcurl发送POST请求并接收它?

    我正在使用 c libcurl 向网页发送 POST 请求 但我正在努力测试它 使用的代码是 include
  • 无效数据的 REST 响应代码

    如果出现以下情况 应将什么响应代码传递给客户端 用户注册时传递了无效数据 例如电子邮件格式错误 用户名 电子邮件已存在 我选择了403 我还发现了以下我觉得可以用的 维基百科 412 前提条件失败 服务器不满足请求者要求的先决条件之一 提出
  • Java byte[] 与 String 之间的转换

    为什么这个junit测试失败了 import org junit Assert import org junit Test import java io UnsupportedEncodingException public class T
  • 将 HTML 导出为 PDF 时出现中文和日文字符编码问题

    我运行一个基于 Web 的时间线制作工具 让用户可以用 HTML JavaScript 创建时间线 然后将其导出到 PDF 文件以便在完成后进行打印 我有几个用户报告了当时间线包含某些 Unicode 字符时将时间线导出为 PDF 时出现的
  • PHP中如何判断字母是大写还是小写?

    我有 UTF 8 格式的文本 也带有变音符号 并且想检查该文本的第一个字母是大写还是小写 这个怎么做 function starts with upper str chr mb substr str 0 1 UTF 8 return mb
  • 与桌面浏览器相比,移动浏览器有多强大? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何解析从java文件中读取的unicode [重复]

    这个问题在这里已经有答案了 我编写了一个包含以下内容的文本文件 u0032 u0142o u017Cy u0142 然后我使用 FileReader 和 BufferedReader 来读取文件 public static void mai
  • 使用:text/plain; 有什么缺点吗?字符集=“UTF-8”

    我的网络服务器提供的内容在 95 的情况下只是简单的 ascii 但在极少数情况下 内容包含一些德语非 ASCII 字符 现在我可以设置content type通过检测内容是否包含任何非 ASCII 字符来响应标头 或者我可以始终设置响应标
  • 为什么 MySQL 将 é 与 e 视为相同?

    我使用 Django Web 应用程序将 Unicode 字符串存储在 MySQL 数据库中 我可以很好地存储 Unicode 数据 但是在查询时 我发现 and e被视为好像它们是同一个角色 In 1 User objects filte
  • .properties 或 JSP 编码有问题

    我有jsp文件
  • SQLite 的不区分大小写的 UTF-8 字符串排序规则 (C/C++)

    我正在寻找一种方法 以不区分大小写的方式对 C 中的 UTF 8 字符串进行比较和排序 以便在SQLite 中的自定义排序规则函数 http www sqlite org c3ref create collation html 该方法应该i

随机推荐

  • jQuery - 将 .one() 与悬停一起使用

    有没有办法让悬停函数只执行一次 这就是我目前正在尝试的 ask live hover function homesearch after hide 300 doTimeout 300 function hideClosedSearchLin
  • @with 注释到底有什么作用? (播放框架)

    我不太明白 with注释的作用 在Play框架站点中 它是这样写的 我们可以使用 With注释来注释控制器来告诉 Play调用相应的拦截器 和继承一样吗 它会调用给定类参数的 before吗 它到底有什么作用 我描述它的最好方法是 它为您的
  • 是否可以阻止 Jetpack Compose 输入修饰符消耗输入事件?

    在旧的 Android View 范例中 视图可以侦听 MotionEvent 而不消耗它们 DispatchTouchEvent or OnTouchEvent可以简单地返回 false 并且 MotionEvent 将穿过一层又一层的视
  • 在树莓派 4 上安装 Rust 后无法运行货物

    我尝试使用推荐的安装脚本在 Raspberrypi 4 上安装 rust pi raspberrypi tmp curl https sh rustup rs sSf sh 但重启后 cargo找不到 pi raspberrypi carg
  • 如何在 post-receive hooks 中获取推送者的信息?

    Git 中的作者 提交者和推送者可以是不同的人 但 git 并没有在日志中存储推送者的信息 那么 我如何得到它 你不知道 The 上游回购不对谁提供提交做出任何假设 可以通过电子邮件 USB 密钥上复制的差异补丁以及其他方式各种传输协议 其
  • 如何使用加速度计计算步数?

    我必须开发与此相同的功能计步器应用程序 我观察到了这一点计步器应用程序非常详细 这不是一个完美的计步器应用程序 例如 如果您停留 坐在一个地方并握手 它还会检测步数和距离 忽略这种理想和重力行为 因为在这个应用程序的说明中已经提到你应该绑住
  • Angular2 与 Haml

    是否可以在 Angular 2 中使用 HAML 作为模板引擎 在 Angular 2 版本2 3 1 你可以使用 scss sass 代替 css 这是给定的选项angular cli with style 对于模板 cli 只允许通过设
  • Spring在没有@Autowired注解的构造函数中注入依赖项

    我正在尝试这个官方 Spring 的示例教程并且对这段代码有依赖 https github com spring guides gs async method tree master complete 如果你看一下代码AppRunner j
  • Rails:查找 HABTM 关系中没有连接的行

    我有两个模型 Users and Leads与HABTM关系相连 class Lead lt ActiveRecord Base has and belongs to many users end class User lt ActiveR
  • 在 Spring Security 中禁用浏览器身份验证对话框

    我正在使用 spring security 4 出于某种原因 在我使用登录页面完成身份验证后 我收到浏览器身份验证对话框 这迫使我再次进行身份验证 这是我的安全配置 http antMatcher test httpBasic and au
  • Google App Engine 自定义域未激活 Google 管理的 SSL

    我在 Google App Engine 上成功为我的应用程序配置了自定义域 我可以通过以下方式访问我的应用程序 http www myapp com 但是 在我的自定义域仪表板上 Google 管理的 SSL 需要很长时间才能激活 我有一
  • 一点到这条曲线的最短距离

    我需要找到多个点到以下形式的曲线的距离 f x a k bx 我的第一个选择是使用它的导数 使用导数的倒数形式的线 给出它的坐标Point并将其与原始曲线相交 最后 我们用简单的几何计算点之间的距离 这就是我通常遵循的数学过程 我需要节省时
  • 在证书上,主题AltName 中的电子邮件地址应为什么类型

    一点背景 我正在建造一个证书颁发机构使用 M2Crypto 和 Django 所以请在投票之前三思而后行 将其视为题外话 我的方法是 最终用户通过电子邮件地址进行识别 并且他们的自签名信任锚显然是由他们自己发布的 但我应该如何存储他们的 身
  • XML 中的转义双引号字符

    xml中的双引号是否有转义字符 我想写一个标签 例如
  • 最短超串搜索的更有效算法

    我下面的问题是 NP 完全的 但是 我试图找到至少稍微快一点的字符串搜索函数或模块 与现在相比 它可能有助于减少一些计算时间 任何建议 将不胜感激 连接的 尽可能长的 超字符串是 AGGAGTCCGCGTGAGGGAGGTGTAGTGTAG
  • 如何在 python 中构造列表项的集合?

    我有一个listpython 中的文件名 我想构造一个set从所有文件名中 filelist for filename in filelist set filename 这似乎不起作用 怎么能做到这一点呢 如果您有一个可哈希对象的列表 文件
  • 为什么分支名称不能在开头包含“#”字符?

    这个 git checkout b 1 my awesome feature 产生错误 error switch b requires a value 用反斜杠转义或用引号括起来都可以 git checkout b 1 my awesome
  • 在 Symfony2 中验证密码

    我正在尝试在 Symfony2 中整合更改密码功能 我有一个 当前密码 字段 一个 新密码 字段和一个 确认新密码 字段 我当前关注的部分是验证 当前密码 字段 顺便说一句 我现在意识到像这样的事情FOSUserBundle存在 可以为我处
  • 如何在 Laravel 5+ 中获取客户端 IP 地址

    我正在尝试在 Laravel 中获取客户端的 IP 地址 在 PHP 中使用以下命令可以轻松获取客户端的 IP SERVER REMOTE ADDR 它在核心 PHP 中工作正常 但是当我在 Laravel 中使用相同的东西时 它返回服务器
  • 在浏览器下载中保留 UTF-8 BOM

    我有一个 JAX RS REST Service 它生成 CSV 文件并将其流回浏览器 一切都设置为 UTF 8 所以我通过浏览器下载的文件也是一个有效的 UTF 8 文件 没有 BOM 它在 Notepad Sublime 等中向我显示有