一、常见的编码格式
(1)GB2312字符集
作用:国家简体中文字符集,兼容ASCII
位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。
范围:高字节从A1-A7,低字节从A1到FE。将高字节和低字节分别加上0xA0即可得到编码。
(2)GBK字符集
作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312.
位数:使用2个字节表示,可表示21886个字符。
范围:高字节从81到FE,低字节从40到FE。
很多中文操作系统上会出现 ANSI 字符集,其实它就是GBK编码。
(3)GB18030字符集
作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK。
位数:它采用变字节表示(1ASCII, 2,4字节)。可表示27484个文字。
范围:1字节从00到7F;2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39。
(4)BIG5字符集
繁体中文编码,主要在台湾地区使用。
(5)Unicode:
UTF-8:Unicode编码的一种,Unicode用一些基本的保留字符制定了三套编码方式,它们分别为UTF-8,UTF-16,UTF-32。在 UTF-8中,字符是以8位序列来编码的,用一个或两个或三个字节来表示一个字符。这种方式的最大好处是 UTF-8 保留了 ASCII 字符的编码作为它的一部分。UTF-8俗称“万国码”,可以同屏显示多语种,一个汉字占用3字节。为了做到国际化,网页尽可能采用UTF-8编码。
在 UTF-8 中,英文字母和数字占一个字节,汉语字符占三个字节。在 UTF-16 中不论是英语字符还是汉语字符或者是其他,通通都占两个字节,因此,UFT-16 比较浪费空间。UTF-32中每个字符占 4 个字节。
二、关于BOM头
(1)BOM
我们在更改记事本文件的编码格式时,经常会出现更改后的文件,比更改前的文件多出了两三个字节。这两三个字节,就是记事本特有的BOM(Byte Oder Mark)头,即字符序列标记,用来标记此文件的编码格式。
中文操作系统环境下,ANSI(即GBK)没有BOM头,UTF-8的 BOM 头为 "EF BB BF",共三个字节,UTF-16的 BOM 头为 "FF FE" ,共两个字节。
(2)大端和小端
UTF-16(Unicode)在存储数据时,每个字符都占两个字节,如果每个字符的两个字节是高位在前、低位在后,我们称之为小端(little endian),反之,低位在前,高位在后的我们称之为大端(big endian)。
(3)BOM头可能带来的问题
我们在进行项目开发的过程中可能会遇到配置文件解析失败的诡异错误,这就可能是BOM头的存在而引起的。我们需要剪掉BOM头重新解析。
(4)特殊字符在记事本中乱码
使用记事本输入诸如 “联通” 等字符,然后保存。重新打开文件,发现这两个字变成了乱码,而且编码格式从编辑时的ANSI格式变成了UTF-8格式。
因为Java中UTF-8两个字节的存储结构如下,
而 “联通“ 两个字的十六进制为 C1 AA,CD AB,转为二进制后,数据格式正好符合 UTF-8 编码格式。所以,记事本以为这是UTF-8的文件,就自动把该文件保存为 UTF-8格式,于是就出现了乱码。