BOM是什么

Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。在UCS 编码中有一个叫做 "Zero Width No-Break Space",中文译名作“零宽无间断间隔”的字符,它的编码是 FEFF。而 FFFE 在 UCS 中是不存在的字符,所以不应该出现在实际传输中。UCS 规范建议我们在传输字节流前,先传输字符 "Zero Width No-Break Space"。这样如果接收者收到 FEFF,就表明这个字节流是 Big-Endian 的;如果收到FFFE,就表明这个字节流是 Little- Endian 的。因此字符 "Zero Width No-Break Space" (“零宽无间断间隔”)又被称作 BOM(即Byte Order Mark)。

UTF-8 BOM头又是什么

UTF-8以字节为编码单元因此不需要 BOM 来表明字节顺序,但可以用 BOM 来表明编码方式。字符 "Zero Width No-Break Space" 的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码了。

因此UTF-8编码的字符串开头处的三个bytes 0xef,0xbb,0xbf就称为UTF-8 BOM头。

为什么excel打开没有BOM头的csv文件会乱码?

类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入UTF-8 BOM头。记事本等编辑器通过它来识别这个文件是否以UTF-8编码(当然即便没有UTF-8 BOM头记事本也能通过其它方式正确识别UTF-8编码)。

那么如果一个UTF-8编码的字符串的开头处没有BOM头又会发生什么?
比如我们用C#创建一个csv文件,里面保存中文,日文等多国语言的字符串然后以UTF-8编码保存(此时没有UTF-8 BOM头)。
记事本能够识别,但是excel却识别出错:

这是一个已知的问题,Excel打开没有BOM头的csv文件时就是会这样!
解决的办法也很简单,在生成字符串时手动把UTF-8 BOM头添加在字符串的开头处,下面是C#代码:
sb.Append('\uFEFF');

好了,重新用Excel打开,已经可以正确识别了!

本文转自sparkdev博客园博客,原文链接:http://www.cnblogs.com/sparkdev/p/5676654.html,如需转载请自行联系原作者

UTF-8 BOM头相关推荐

  1. UTF-8的BOM头

    字符编码相关信息  http://baike.baidu.com/view/1204863.htm UTF-8 编码的文件可以分为no BOM 和 BOM两种格式. 有bom头的存储或者字节流,它一定 ...

  2. bug:生产问题,Golang解决csv文件用excel打开中文乱码问题及常见编码和BOM头关系

    bug:Golang解决csv文件用excel打开中文乱码问题 1 场景及分析 场景:今天在生成csv文件之后,测试发现用office和wps打开乱码 分析:经过测试之后发现使用记事本打开不乱码,同时 ...

  3. bom头解释方法和去掉方法

    什么是bom头? 在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也 ...

  4. 编码问题(BOM头简单了解)

    浅谈编码问题 中文编码 gb2312 (采用两个字节保存字符汉字,英文数字一个字节) GBK (采用两个字节保存字符汉字,英文数字一个字节) GB18030 (英文数字都是一个字节,中文是两个或四个字 ...

  5. [java]处理utf-8 bom字符串的bom头

    char[] bomChar = "带bom的字符串".toCharArray();//转为char数组 char[] noneBomchar = new char[bomChar ...

  6. 解释BOM头和去掉方法

    http://www.thinkphp.cn/topic/2592.html 以上是叫你去掉bom头的,因为有些文件加载不出来就是window会以记事本的形式打开,然后默认给我们加了了bom头,有些文 ...

  7. php 头bom_关于php中bom头的简介

    关于php中bom头的简介 发布时间:2020-06-30 17:48:12 来源:亿速云 阅读:99 作者:清晨 这篇文章主要介绍关于php中bom头的简介,文中示例代码介绍的非常详细,具有一定的参 ...

  8. 由web程序出现乱码开始挖掘(Bom头、字符集与乱码)

    从第一次开始写web程序,自己还有身边同事开发出现乱码情况基本都没有消停过.估计以后还会一样继续. 这么些年,不断修修改改,也总结也归纳.程序从asp,asp.net,jsp,php,服务器从wind ...

  9. Java处理文件BOM头的方式推荐

    背景: java普通的文件读取方式对于bom是无法正常识别的. 使用普通的InputStreamReader,如果采用的编码正确,那么可以获得正确的字符,但bom仍然附带在结果中,很容易导致数据处理出 ...

最新文章

  1. Apache 基金会发布2018财年年报:Java 项目占大半
  2. C实现socket编程
  3. 【MM模块】Physics Inventory 库存盘点差异
  4. 笔记-项目整体管理-项目工作说明书
  5. 算法 --- 二叉树的最大深度
  6. C语言方向键识别和字母识别,c语言中怎样输入和读取方向键
  7. ReportLab for PDF
  8. python解题软件哪个好用_几个好用的Python数据分析工具
  9. 移动GPU三种主流架构优缺点浅析
  10. 使用ASP.NET Web API和Handlebars的Web模板
  11. Hibernate之ID生成规则
  12. 基于Chrome插件的微博超话自动签到
  13. TCP 协议有什么缺陷?
  14. FFmpeg转码B帧
  15. ESP8266 简单研究 ESP8285 研究
  16. 手动删除Mac版迅雷无用的功能,让迅雷软件更清爽无广告纯粹下载
  17. 05.Node.js和浏览器之间的差异
  18. LoadBalancer负载均衡
  19. 故障排查——CPU使用率过高
  20. android 消息提示机制

热门文章

  1. 华为鲲鹏高校行长沙启航,助力基础研究成果转化
  2. 行业 AI 落地新范式,华为云下午茶等你来聊知识计算
  3. 清华通信本硕巨佬秋招经验总结,收割互联网大厂后端 SP/SSP offer,太强了!
  4. 神秘使者到 Java 帝国传道协程,竟被轰了出去!
  5. JS中的prototype、__proto__与constructor
  6. WCF 设计和实现服务协定(01)
  7. linux下生成https的crt和key证书
  8. LAMP一体环境快速安装
  9. T-SQL 聚合函数Count与NULL
  10. 维基百科创始人:将欧盟隐私规定推至全球将带来灾难