博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UTF的字节序和BOM
阅读量:6457 次
发布时间:2019-06-23

本文共 1182 字,大约阅读时间需要 3 分钟。

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是“594E”,“乙”的Unicode编码是“4E59”。如果收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。 BOM是一个有点小聪明的想法:在UCS(Unicode Character Set)编码中有一个叫做“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。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符“ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。

根据BOM的规则,在一段字节流开始时,如果接收到以下字节,则分别表明了该文本文件的编码。

UTF-8: EF BB BF

UTF-16 : FF FE

UTF-16 big-endian: FE FF

UTF-32 little-endian: FF FE 00 00

UTF-32 big-endian: 00 00 FE FF

而如果不是以这个开头,那程序则会以ANSI,也就是系统默认编码读取。

再来看一下大端(big-endian)、小端(little-endian),大端方式将高位存放在低地址,小端方式将高位存放在高地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。

如同样是字符“A”﹐在以下几种格式中的存储形式分别是﹕

UTF-16 big-endian : 00 41

UTF-16 little-endian : 41 00

UTF-32 big-endian : 00 00 00 41

UTF-32 little-endian : 41 00 00 00

转载于:https://www.cnblogs.com/zhuyf87/archive/2012/11/07/2758810.html

你可能感兴趣的文章
都说Python是最佳编程入门语言,为什么你学习却是如此坎坷?
查看>>
利用windows.h头文件写一个简单的C语言倒计时
查看>>
过滤器
查看>>
MyBatsi-Mapper映射文件
查看>>
Entity Framework技术系列之2:三种开发模式实现数据访问
查看>>
SpringMVC 处理器执行链 (HandlerMapping)的执行过程
查看>>
正则匹配汉子
查看>>
hbase安装部署
查看>>
3.1.3 SQL Server Management Studio 配置
查看>>
补题计划
查看>>
一道关于位数扩充的题目
查看>>
sql存储过程几个简单例子
查看>>
浏览器编辑web页面的方法
查看>>
SVN状态图标消失的解决方法
查看>>
struct模块
查看>>
重装系统
查看>>
[论文笔记] Crowdsourcing Taxonomies (ESWC, 2012)
查看>>
Digital Roots
查看>>
接口类的多继承
查看>>
获得每日,每周,每月的0点和24点的时间戳
查看>>