编码那些事

其实这是个历史问题,要想真正弄懂这些编码,去google下编码的历史吧。在这里,我只简单的记录他们的区别

1.ASCII:基于拉丁字母的一套电脑编码系统,它主要用于显示现代英语,不支持其他语言

2.Ansi:由1,不同的国家和地区制定了不同的标准来支持自己的语言,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码

3.Unicode:由国际组织设计,可以容纳全世界所有语言文字的编码方案.分为:UCS-2和UCS-4,UCS-2用两个字节编码,UCS-4用4个字节编码,和ASCII字符集之间的不兼容,而且Unicode其实只是一张巨大的编码表,要在计算机里面实现,也出现了几种不同的方案,也就是说如何表示unicode编码的问题,因此诞生了UTF,

4.UTF-8:针对Unicode的可变长度字符编码,UTF-8使用一至四个字节为每个字符编码,电子邮件、网页及其他存储或传送文字的应用中,优先采用

5.UTF-16:UTF-16编码以16位无符号整数为单位。现在机器上的unicode编码一般指的就是UTF-16。绝大部分2个字节就够了,但是不能绝对的说所有字符都是2个字节。这个要看字符的unicode编码处于什么范围而定,有可能是2个字节,也可能是4个字节

6.BOM

到底采用什么编码,如果能检测就好了。专家们也是这么想的,所以专家给每种格式和字节序规定了一些特殊的编码,

这些编码在unicode 中是没有使用的,所以不用担心会冲突。

这个叫做BOM(Byte Order Mark)头。意思是字节序标志头。通过它基本能确定编码格式和字节序。
UTF编码            Byte Order Mark   
EF BB BF    UTF-8
FE FF        UTF-16/UCS-2, little endian
FF FE        UTF-16/UCS-2, big endian
FF FE 00 00      UTF-32/UCS-4, little endian.
00 00 FE FF      UTF-32/UCS-4, big-endian.
所以通过检测文件前面的BOM头,基本能确定编码格式和字节序。
但是这个BOM头只是建议添加,不是强制的,所以不少软件和系统没有添加这个BOM头(所以有些软件格式中有带BOM头

和NoBOM头的选择),这个时候要检测什么格式,就比较麻烦了
当然可以检测,但是不能保证100%准确,只能通过编码范围从概率上来检查,虽然准确度还是比较高,但是不能保证

100%。所以,时常看到检测错误的软件,也不奇怪了。

你可能感兴趣的:(编码那些事)