编码理解

在计算机内部,所有信息都表示成二进制01,若要显示出来让人看懂,需要进行编码转换。如汉字”严”以 Unicode编码保存到计算机中是4E25,即01001110 00100101,显示给用户看时,通过Unicode编码表查看4E25对应的是”严”,显示出来。
编码的发展过程:

(1)ASCII码

字节是计算机存储的基本单位,一字节等于八位(1byte = 8bit)。一个字节可以表示256种状态(00000000-11111111)。因此ASCII码被发明来表示128个字符(00000000-01111111),只占用后七位,第一位默认为0。其中包含所有英文字母及其他一些字符,如大写字母”A”表示为01000001(10进制为65)。

(2)ASCII码加强

有些国家不用英文,自己利用字节最高位创造了一些其他字符,多表示了ASCII码除外的128个字符。如法语é表示为10000010。

(3)ISO-8859-1

各个组织各搞各的没有标准很混乱,ISO 组织发明了ISO-8859-1涵盖了大多数西欧语言字符,总共能表示 256 个字符。

(4)GB2312

中国自己发明了GB2312来表示中文,双字节,编码范围是 A1-F7。

(5)GBK

GB2312表示的汉字太少,GBK 扩展了,编码范围是 8140-FEFE(去掉 XX7F)总共能表示23940个字符。

(6)Unicode

编码过多,每次打开文件都得判断是哪种编码,进行对应的编码转换,而且系统必须支持。为了统一编码,出现了Unicode。Unicode涵盖了所有字符集。如汉字”严”,Unicode编码为4E25。

(7)UCS

UCS(Unicode Character Set),Unicode的简称。目前有两种格式:UCS-2和UCS-4。UCS-2就是用两个字节编码,UCS-4就是用4个字节编码。

(8)UTF-8

Unicode只是一个概念,表示一个字符和二进制对应关系表,若直接存储进计算机会出现问题。如汉字”严”,Unicode编码为4E25,二进制为01001110 00100101,直接存储二进制,和ASCII码串”N%”(也是01001110 00100101)存储内容一样,无法区分。
UTF-8就是为了专门存储Unicode而产生,规则如下:
1. ASCII码保持不变,依然是0xxxxxxx
2. 对于其他 n 字节(n>1)的字符,第一个字节的前n位都为1,第n+1位为0,后面字节的前两位为10,其他没提及的二进制位,全部为这个字符的unicode码。

Unicode符号范围 UTF-8编码方式
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

(9)UTF-16

UTF-8以单字节(8bit)为基础单位,UTF-16以双字节(16bit)为基本单位。其中BMP(基本多语言平面,U+0000至U+FFFF)双字节,包含了最常用的字符,与Unicode编码一致;其他的是辅助平面,四字节。
多字节存储存在读取大小端问题,”大头方式”(Big endian),第二个字节在前就是”小头方式”(Little endian)。
Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。

(10)UTF-32

UTF-32以四字节(32bit)为基础单位,足够存储所有字符。

github 地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章