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. 2015多校第7场 HDU 5378 Leader in Tree Land 概率DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:一棵n个节点的树.对其节点进行标号(1~n).求恰好存在k个节点的标号是其节点所在子树的最 ...

  2. Mac OSX下Appium驱动iPhone真机

    1.安装Xcode.Command Line Tools和Appium. 2.安装brew:/usr/bin/ruby -e "$(curl -fsSL https://raw.github ...

  3. springboot基础知识学习

    一.springboot中常用的注解: 原文链接:http://blog.csdn.net/lafengwnagzi/article/details/53034369 原文链接:http://www. ...

  4. .net页面实时预览图片

    <script type="text/javascript"> //获取上传图片的本地路径 function getPath(obj){ if(obj) { if(na ...

  5. [hadoop][基本原理]zookeeper简单使用

    代码:https://github.com/xufeng79x/ZkClientTest 1.简介 zookeeper的基本原理和使用场景描述可参考:[hadoop][基本原理]zookeeper基本 ...

  6. C#ActiveX控件开发

    1.新建项目,选择C#,选择.NET Framework2.0,新建一个Windows窗体控件库项目,命名为ActiveXDemo; 2.右击ActiveXDem项目,选择属性——应用程序——程序集信 ...

  7. leetcode 之Candy(12)

    这题的思路很巧妙,分两遍扫描,将元素分别和左右元素相比较. int candy(vector<int> &rattings) { int n = rattings.size(); ...

  8. MySQL的读写分离---主从复制、主主复制

    1.复制是基于BinLog日志 存在三种日志格式:Statement:存储Sql语句,存储日志量是最小的.有可能复制不一致Row:存储event数据,存储日志量大,但是不能很直接进行读取:Mixed: ...

  9. 多路复用I/O模型epoll() 模型 代码实现

    epoll模型 int epoll_create(int maxevent) //创建一个epoll的句柄 然后maxevent表示监听的数目的大小int epoll_ctl(int epollfd, ...

  10. 二、ansible配置简要介绍

    [defaults] # some basic default values… hostfile = /etc/ansible/hosts \\指定默认hosts配置的位置 # library_pat ...