文本文件保存的是字符的编码值,在字符显示的时候字符显示的样子是由字体所决定的.
ASCII编码
ASCII编码是用一个字节的低7位来表示128个数值,在ASCII码中最高位永远是0.
ASCII编码百度百科
ANSI编码
ANSI是ASCII的扩展,向下兼容ASCII.对于ASCII字符仍用ASCII来表示,对于非ASCII字符则使用2字节来表示.ANSI并不是特定的一种字符编码,它与本地化(local)密切相关,在windows平台上,不同地区的ANSI编码代表不同的字符编码.例如中国台湾的ANSI实际是GB2312,中国台湾的ANSI实际是BIG5编码,等待即不同地区的ANSI对应不同的字符编码方式.
ANSI编码介绍
unicode编码
unicode编码就是为解决ANSI编码在不同地区编码方式不同的问题.unicode编码中任意一个字符都有一个唯一的编码与之对应.
unicode编码向下兼容ASCII,且unicode编码的编码有效范围是0x0000-0x10ffff.unicode编码可以表示100万个字符,足够使用.
unicode编码实现
由于unicode使用3个字节来表示字符编码.但是对于ASCII这些仅使用1个字节就可以表示的字符直接使用3个字节来表示就太浪费空间了,所以unicode编码又有如下的编码方式.在介绍unicode的实际采用的编码时先了解下字节序:
- 大端字节序:数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址 0x1234的大端存储:0x3412.较为通俗的表示:数值权重低(0x12)的字节放在后面
- 小端字节序:数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址 0x1234的小端存储:0x1234.较为通俗的表示:数值权重低(0x12)的字节放在前面
每个unicode使用3个字节表示,太浪费空间,而使用2个字节来表示的话基本上所有常用字符都可以表示.以下两种编码方式就是使用2个字节来表示常用字符的编码方式.
UTF-16-LE
每个字符使用2个字节表示,使用小端方式存储
UTF-16-BE
每个字符使用2个字节表示,使用大端方式存储
UTF-8编码
UTF-16的两种编码方式都是用2个字节来表示字符,但是这种编码方式有如下几个缺点:
- 表示的字符数量有限
- 对于ASCII字符又有空间浪费的情况出现
- 如果文件中出现某个字节丢失,会使此字符后的所有字符都因为错位而无法正常显示.
UTF-8编码是变长的编码方式.另外UTF-8编码也有两种格式: - UTF-8 不带BOM:即文件中的所有数据都是使用utf8编码的字符数据
- UTF-8 带BOM:文件有一个起始头部:0xefbbbf,来表示此文件是utf8编码的,后续数据都是使用utf8编码的字符数据.
UTF-8的编码方式
-
ASCII字符:直接使用ASCII码来表示
-
非ASCII字符:使用变长编码:每一个字节的高位都自带长度信息.如下图:
- 0xe4[1110 0100]:高位1110中前两位表示此字节起有3个字符参与unicode编码.后面的10表示这是这个字节内utf8字符编码的起始位,即1110 0100 中仅0100是有效数据.
- 0xb8[1011 1000]:由于0xe4已经确定是3个字节,这是第2个字节.前导的10表示这是这个字节内utf8字符编码的起始位,即仅11 1000是有效数据.
- 0xad[1010 1101]:由于0xe4已经确定是3个字节,这是第3个字节.前导的10表示这是这个字节内utf8字符编码的起始位,即仅10 1101是有效数据
最终的有效数据就是0100111000101101–>0x4e2d
从上面的分析可以看出,由于非ASCII字符的编码都是带有长度信息的,如果其中某个非ASCII字符出错,仅仅只影响这一个字符,后面的字符并不受影响.比UTF-16要更加安全可靠.