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. sicily 1052. Candy Sharing Game

    Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description A number of students sit in a circle ...

  2. 003 CopyOnWriteArrayList原理

    聊聊并发-Java中的Copy-On-Write容器 Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候 ...

  3. BZOJ 4241: 历史研究——莫队 二叉堆

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4241 题意:N个int范围内的数,M次询问一个区间最大的(数字*出现次数)(加权众数),可以 ...

  4. 关于进度管理工具Gantt图

    关于进度管理工具Gantt图 18.以下关于进度管理工具图的叙述中,不正确的是( D). A.能清晰地表达每个任务的开始时间.结束时间和持续时间 B.能清晰地表达任务之间的并行关系 C.不能清晰地确定 ...

  5. windows系统安装mysql压缩zip版

    1.下载 打开官网:https://www.mysql.com 进入DOWNLOADS--->Community--->MySQL Community Server,选择系统对应的版本点击 ...

  6. Leetcode 之Binary Tree Inorder Traversal(43)

    树的中序遍历.先不断压入左结点至末尾,再访问,再压入右结点.注意和先序遍历的比较 vector<int> inorderTraversal(TreeNode *root) { vector ...

  7. Http请求加签、验证操作

    加签.验签的作用 常见的http请求交互过程中,请求参数通过url或者request body等形式传输.但是由于http请求的开放性,使得请求参数很容易被拦截篡改.因此,需要对请求参数进行加签,然后 ...

  8. 【hdoj_2152】Fruit(母函数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2152 本题采用母函数模板求解,母函数模板如下: http://blog.csdn.net/ten_sory ...

  9. 【转】eclipse for java ee的tomcat配置(常见问题解决)

    原文:http://blog.csdn.net/lanzhizhuxia/article/details/8087709 前一段时间准备学习ssh的源码,但是web开发的环境一直没有弄好,myecli ...

  10. LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)

    #6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5   题目描述 给出 ...