Unicode中的BOM
BOM简述
BOM是byte order mark的缩写,在UTF-16和UTF-32中需要使用BOM来区分字节的顺序,因为我们目前的CPU有两种系列,一种是大端模式,一种是小端模式(我们常用的电脑手机均是这种)。当我们在自己电脑上编写文件时可能并不会出现问题,但是如果我们在自己电脑(小端)上写了一个文件上传给服务器(大端)进行分析,就会出现问题,因此人们为了解决这个问题就在整个文本文件的最前面添加了一个叫BOM的东西,用来记录这个文件是用小端顺序存储的还是大端顺序存储的。这样以来不管这个文件传到哪里,只要按照BOM所记录的顺序来解析就不会出错。
你可能会注意我们在上面仅提到了UTF-16和UTF-32,并没有提到UFT-8,这是因为UTF-8自己的编码方式决定了它不可能出现由字节顺序引起的问题,但是带有强迫症的微软公司,没错就是这个叫Microsoft的公司,莫名其妙在UTF-8这种编码的文件头也添加了BOM,这就导致后来的UTF-8编码的文件有带有BOM版和不带BOM版这两个版本,大部分高级编辑器默认保存的文件是不带BOM版,Microsoft自家的notpad默认保存的文件是带有BOM版的。
我们现在以UTF-8和UTF-16为例来谈一下具体为什么这两个东西的编码一个需要BOM,一个不需要BOM。
UTF-8编码
UTF-8这个编码对每个字符存储为几个自己是不固定的,最少为1个字节,最多为4个字节,具体见下面这张图。当某个字符的编码为一个字节时拥有7个比特位给它编码,两个字节拥有11个比特位,3个字节拥有16个比特位,4个字节拥有21个比特位。其中剩余的比特位用来标注,并不用于编码。比如当解码器碰到某个字节以0开头,则说明这是一个单字节字符,当它碰到某个字节以1110开头则表明这个是一个三字节字符,当它碰到10开头的字节,说明这个字节属于某个字符编码的一部分,而不是一个新字符的开始。很显然,UTF-8的编码已经规定了每个字符占几个字节,如果是多个字节则第一个字节应该是什么样子,第二个字节应该是什么样子,...,这样以来就不会出现因字节顺序而引起的问题。一般来说我们用的汉字基本都是用三字节编码的。

UTF-16编码
UTF-16与UTF-8不同,它在UCS(辅助字符平面)出现之前所有的字符都是两个字节编码,在UCS之后存在一部分字符是四字节编码,但是常用的字符依然是两字节编码。当它是两字节编码时从0x0000到0xD700为基本字符平面(用于编码两字节字符的平面),这样一来如果有一个字符的编码为0xC3 0xA4,那么怎么解释呢?大端解释为0xC3A4,小端解释为0xA4C3。这就出现了歧义,因而就需要BOM来标明该文件的编码顺序。
解惑
即使上面已经解释了编码方式,但是仍然有些童鞋还是不懂?看下面

上图中,如果将C3和A4互换位置完全能在UTF-16中解析位两个不同的字符,而在UTF-8中将字节顺序倒过(10 100100-10 001110-1110 1100)来解析不了,因为前面说过在UTF-8的编码中以10开头的字节是一个字符的一部分,而不是新字符的开始,所以倒过来无法解析出一个新字符。
BOM
在UTF-16(小端)中BOM为FF FE,UTF-16(大端)中BOM为FE FF。这个其实很好记,大端还有另外一个名字叫大尾端(小端同理),FF显然比FE大,所以在大尾端中它的尾巴是FF,即大端BOM为FEFF。
在UTF-32中,小端BOM为FFFE0000,大端BOM为0000FEFF。
在UTF-8带BOM的版本中,BOM为EF BB BF。
Unicode中的BOM的更多相关文章
- Unicode规范中的BOM 和 ISO8891-1编码
Unicode规范中的BOM Unicode规范中有一个BOM的概念.BOM——Byte Order Mark,就是字节序标记.在这里找到一段关于BOM的说明: 在UCS 编码中有一个叫做" ...
- 中文在unicode中的编码范围
以前写过一篇贴子是写中文在unicode中的编码范围 unicode中文范围,但写的不是很详细,今天再次研究了下unicode,并给出详细的unicode取值范围. 本次研究的unicode对象是un ...
- UTF-8中的BOM
UTF-8中的BOM UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式.字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB B ...
- [转载]Unicode中对中文字符的编码
以前写过一篇贴子是写中文在unicode中的编码范围 unicode中文范围,但写的不是很详细,今天再次研究了下unicode,并给出详细的unicode取值范围. 本次研究的unicode对象是un ...
- js中的BOM对象
浏览器对象模型(BOM)以 window 对象为依托,表示浏览器窗口以及页面可见区域.同时, window对象还是 ECMAScript 中的 Global 对象,因而所有全局变量和函数都是它的属性, ...
- 【学习笔记】:JavaScript中的BOM对象
JavaScript中的BOM对象 BOM(Browser Object Model):浏览器对象模型. BOM可用于对浏览器窗口进行访问,但BOM没有相关的标准,所以根据浏览器的不同,其中定义的对象 ...
- 【Python】使用codecs模块进行文件操作及消除文件中的BOM
前言 此前遇到过UTF8格式的文件有无BOM的导致的问题,最近在做自动化测试,读写配置文件时又遇到类似的问题,和此前一样,又是折腾了挺久之后,通过工具比较才知道原因. 两次在一个问题上面栽更头,就在想 ...
- IDEA UTF-8 中含 bom 运行报错 批量处理将bom移除
将eclipse中的项目导入到idea或者as的环境中,遇到UTF-8含有BOM编码报错的问题,之前每次遇到这样的问题都特么用EditPlus一个一个的转换,感觉太烦了,后面就自己写了一个批量处理的工 ...
- Unicode中文和特殊字符的编码范围
编程中有时候需要用到匹配中文的正则,一般用 [ \u4e00-\u9fa5]+ 即可搞定.不过这正则对一般的火星文鸟语就不太适用了,甚至全角的标点符号都不包含在内.例如游戏里面的玩家名,普通青年一般都 ...
随机推荐
- 获取file中字段,写入到TXT文件中
一下代码省略了很多,哈哈哈 a.txt文件 uid,type,pointx,pointy,name1,9,911233763,543857286,区间测速起点3,9,906371086,5453354 ...
- grep常见操作整理(更新)
提取邮箱和URL [root@test88 ~]# cat url_email.txt root@gmail.com,http://blog.peter.com,peter@qq.com [root@ ...
- HUD-5379
Mahjong tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- 使用Guava retryer优雅的实现接口重调机制
API 接口调用异常, 网络异常在我们日常开发中经常会遇到,这种情况下我们需要先重试几次调用才能将其标识为错误并在确认错误之后发送异常提醒.guava-retry可以灵活的实现这一功能.Guava r ...
- [].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) })
问问你自己,看得懂这行代码吗?要是看不懂就点击进来看看吧,要是看的懂得话,可以绕路 1.call:call(thisObj,arg1,arg2,arg3) [].forEach.call($$(&qu ...
- C#取出字符串中的数字或字母
string str20 = "ABC123"; string strSplit1,strSplit2; //取出字符串中所有的英文字母 strSplit1 = Regex.Rep ...
- C# 导入Excel
#region 导入 /// <summary> /// 导入 /// </summary> /// <param name="sender"> ...
- 【JBPM4】任务节点-任务分配swimlane
swimlane泳道,几个任务受理人相同的任务节点,可以划分为一个泳道 JPDL <?xml version="1.0" encoding="UTF-8" ...
- ios 安卓 video 取消播放自动全屏 属性
x-webkit-airplay="true",x5-playsinline="true",webkit-playsinline="true" ...
- CentOS 7.4 下面安装 jdk 10 的一点总结
CentOS 7.4 下面安装 jdk 10 的一点总结 一.前期工作 1.检验系统原版本 [root@zck ~]# java -version java version "1.7.0_& ...