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的更多相关文章

  1. Unicode规范中的BOM 和 ISO8891-1编码

    Unicode规范中的BOM Unicode规范中有一个BOM的概念.BOM——Byte Order Mark,就是字节序标记.在这里找到一段关于BOM的说明: 在UCS 编码中有一个叫做" ...

  2. 中文在unicode中的编码范围

    以前写过一篇贴子是写中文在unicode中的编码范围 unicode中文范围,但写的不是很详细,今天再次研究了下unicode,并给出详细的unicode取值范围. 本次研究的unicode对象是un ...

  3. UTF-8中的BOM

    UTF-8中的BOM UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式.字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB B ...

  4. [转载]Unicode中对中文字符的编码

    以前写过一篇贴子是写中文在unicode中的编码范围 unicode中文范围,但写的不是很详细,今天再次研究了下unicode,并给出详细的unicode取值范围. 本次研究的unicode对象是un ...

  5. js中的BOM对象

    浏览器对象模型(BOM)以 window 对象为依托,表示浏览器窗口以及页面可见区域.同时, window对象还是 ECMAScript 中的 Global 对象,因而所有全局变量和函数都是它的属性, ...

  6. 【学习笔记】:JavaScript中的BOM对象

    JavaScript中的BOM对象 BOM(Browser Object Model):浏览器对象模型. BOM可用于对浏览器窗口进行访问,但BOM没有相关的标准,所以根据浏览器的不同,其中定义的对象 ...

  7. 【Python】使用codecs模块进行文件操作及消除文件中的BOM

    前言 此前遇到过UTF8格式的文件有无BOM的导致的问题,最近在做自动化测试,读写配置文件时又遇到类似的问题,和此前一样,又是折腾了挺久之后,通过工具比较才知道原因. 两次在一个问题上面栽更头,就在想 ...

  8. IDEA UTF-8 中含 bom 运行报错 批量处理将bom移除

    将eclipse中的项目导入到idea或者as的环境中,遇到UTF-8含有BOM编码报错的问题,之前每次遇到这样的问题都特么用EditPlus一个一个的转换,感觉太烦了,后面就自己写了一个批量处理的工 ...

  9. Unicode中文和特殊字符的编码范围

    编程中有时候需要用到匹配中文的正则,一般用 [ \u4e00-\u9fa5]+ 即可搞定.不过这正则对一般的火星文鸟语就不太适用了,甚至全角的标点符号都不包含在内.例如游戏里面的玩家名,普通青年一般都 ...

随机推荐

  1. 【bzoj3223】文艺平衡树

    #include<bits/stdc++.h> #define N 300005 #define rat 4 using namespace std; struct Node{ int s ...

  2. 生命周期(vue的钩子函数)

    生命周期图示 创建前,创建后,挂载前,挂载后,更新前,更新后,销毁前,销毁后 beforeCreate:function(){ console.log('1-beforeCreate 组件还未被创建' ...

  3. vue 同页面不同参数

    项目:详情页中有一个模块为更多产品,点击也是跳转到详情页,也就是相同路由,不同参数. 试过的方法:用this.$router.push,并没有任何反应,没有任何请求,页面也未重新加载,用this.$e ...

  4. dotnet core多平台开发体验(mac os x 、windows、linux)

    前言 随着net core rc2的发布,园子里面关于net core的入门文章也也多了起来,但是大多数都是在一个平台上面来写几个简单的例子,或者是在解释代码本身,并没有体现说在一个平台上面创建一个项 ...

  5. ora11g listener.ora

    配置内容方式1: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC) (KEY = EXTPROC152 ...

  6. python_day3学习笔记

    set集合 python的set是一个无序不重复元素集,基本功能包括关系测试和消除重复元素. 集合对象还支持并.交.差.对称差等. sets 支持 x in set. len(set).和 for x ...

  7. AC日记——送花 洛谷 P2073

    送花 思路: 线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct TreeN ...

  8. 跨域请求方式之Jsonp形式

    在浏览器端才有跨域安全限制一说,而在服务器端是没有跨域安全限制的. 在两个异构系统(开发语言不同)之间达到资源共享就需要发起一个跨域请求. 而浏览器的同源策略却限制了从一个源头的文档资源或脚本资源与来 ...

  9. 洛谷P3805 [模板]Manacher算法 [manacher]

    题目传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符 ...

  10. 制作启动U盘

    概述 将普通的u盘制作成启动u盘,用于引导安装操作系统. 材料: 普通U盘 需要有足够的存储空间,里面的内容请提前备份. 操作系统iso文件 PowerISO 商业软件,有试用期:用来制作启动u盘 正 ...