梳理各种编码

来源:互联网 发布:那些软件可以赚集分宝 编辑:程序博客网 时间:2024/05/01 11:07

一直以来对各种编码都模糊不清,这几天比较闲,就来梳理一下。

文章是对blog.csdn.net/u013480667/article/details/43916537的整理,再加入自己的一些理解。


1.ASCII码

ASCII码是上个世纪60年代,美国制定的一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。

ASCII码是一个字节,8位,即8个二进制码,对应着256种状态,即256个字符,但ASCII码一共占用了128个字符,最前面一位规定为0.


2.ASCII码扩展

128中字符在英语中是够用的,但是在其他国家就不够用了,于是其他国家就把剩余的128种进行了扩充,导致了在不同的编码方式中,前128种字符是一样的,后128种不同


3.GB2312

对于中国来说,256个字符是远远不够,所以我们把127之后的字符取消,规定小于127的字符和原来相同,用两个大于127的字符连在一起表示一个汉字,前面一个字节(高字节)从0xA1到0xF7,后面一个字节(低字节)从0xA1到0xFE(暂时还不清楚为什么这个范围),这样的组合大约有7000多个,这些编码中,还将数学符号,罗马希腊的字母,日文的假名,以及原来ASCII中本来就有的字母,数字,标点进行了重新的两个字节的编码,这就是“全角”字符,原来在127号之前的就是“半角字符”。

这种编码就叫做GB2312。GB2312是对ASCII的中文扩展。


4.GBK

由于扩充的GB2312还是不够用,所以只要第一个字节大于127就表示是一个汉字的开始,后面的字节可以是大于或者小于127,扩展之后的编码旧叫做GBK标准,GBK包括了GB2312,同时又增加了近20000个新的汉字和符号。


5.GB18030

在GBK的基础上又进行了扩充,加入了几千个新的少数民族的字,这旧是GB18030.


以上GB2312,GBK,GB18030通称为“DBCS”(Double Byte Charecter Set 双字节字符集)。最大的特点是两个字节长的汉字字符和一个字节长的英文字符共存于一套编码,小于127是单字节,大于127旧是双字节字符集里的字符出现了。


6.UNICODE

不同的DBCS编码方案导致了不同编码之间的交流困难。ISO(国际标准化组织)便制定了UNICODE,即“Universal Muktipke-Octet Character Set”,简称UCS。

ISO规定UNICODE必须用两个字节表示所有字符,对于ASCII中的半角字符,即小于127的字符,UNICODE只是将其长度由原来的8位扩展位16位(高8位全部是0)。

UNICODE和GBK的转换必须通过查表进行。

但是UNICODE的存储方式是有多种的。


7.UTF-8

由于互联网的普及,就需要考虑UNICODE的传输方式。UTF-8就是UNICODE的一种实现方式。即每次8个位传输数据。其他方式还有UTF-16,UTF32。

UTF-8是一种变长的编码方式,使用1-4个字节表示一个符号。

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

下表总结了编码规则,字母x表示可用编码的位。

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

下面,还是以汉字“严”为例,演示如何实现UTF-8编码。

已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

8.其他

8.1 Little endian 和 Big endian

UNICODE用两个字节存储,严的UNICODE码是4E25,大端存储方式是4E25,小端存储方式是254E。

为了让计算机知道文件到底采用哪一种方式编码,UNICODE中规定,每一个文件最前面加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。

如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。

8.2 windows中的ANSI编码方式,是指的默认的编码方式,对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对简体中文版,如果是繁体中文版会用Big5码)。


附:

ASCII码表

BinDecHex缩写/字符解释00000000000NUL(null)空字符00000001101SOH(start of headling)标题开始00000010202STX (start of text)正文开始00000011303ETX (end of text)正文结束00000100404EOT (end of transmission)传输结束00000101505ENQ (enquiry)请求00000110606ACK (acknowledge)收到通知00000111707BEL (bell)响铃00001000808BS (backspace)退格00001001909HT (horizontal tab)水平制表符00001010100ALF (NL line feed, new line)换行键00001011110BVT (vertical tab)垂直制表符00001100120CFF (NP form feed, new page)换页键00001101130DCR (carriage return)回车键00001110140ESO (shift out)不用切换00001111150FSI (shift in)启用切换000100001610DLE (data link escape)数据链路转义000100011711DC1 (device control 1)设备控制1000100101812DC2 (device control 2)设备控制2000100111913DC3 (device control 3)设备控制3000101002014DC4 (device control 4)设备控制4000101012115NAK (negative acknowledge)拒绝接收000101102216SYN (synchronous idle)同步空闲000101112317ETB (end of trans. block)传输块结束000110002418CAN (cancel)取消000110012519EM (end of medium)介质中断00011010261ASUB (substitute)替补00011011271BESC (escape)溢出00011100281CFS (file separator)文件分割符00011101291DGS (group separator)分组符00011110301ERS (record separator)记录分离符00011111311FUS (unit separator)单元分隔符001000003220(space)空格001000013321! 001000103422" 001000113523# 001001003624$ 001001013725% 001001103826& 001001113927' 001010004028( 001010014129) 00101010422A* 00101011432B+ 00101100442C, 00101101452D- 00101110462E. 00101111472F/ 0011000048300 0011000149311 0011001050322 0011001151333 0011010052344 0011010153355 0011011054366 0011011155377 0011100056388 0011100157399 00111010583A: 00111011593B; 00111100603C< 00111101613D= 00111110623E> 00111111633F? 010000006440@ 010000016541A 010000106642B 010000116743C 010001006844D 010001016945E 010001107046F 010001117147G 010010007248H 010010017349I 01001010744AJ 01001011754BK 01001100764CL 01001101774DM 01001110784EN 01001111794FO 010100008050P 010100018151Q 010100108252R 010100118353S 010101008454T 010101018555U 010101108656V 010101118757W 010110008858X 010110018959Y 01011010905AZ 01011011915B[ 01011100925C\ 01011101935D] 01011110945E^ 01011111955F_ 011000009660` 011000019761a 011000109862b 011000119963c 0110010010064d 0110010110165e 0110011010266f 0110011110367g 0110100010468h 0110100110569i 011010101066Aj 011010111076Bk 011011001086Cl 011011011096Dm 011011101106En 011011111116Fo 0111000011270p 0111000111371q 0111001011472r 0111001111573s 0111010011674t 0111010111775u 0111011011876v 0111011111977w 0111100012078x 0111100112179y 011110101227Az 011110111237B{ 011111001247C| 011111011257D} 011111101267E~ 011111111277FDEL (delete)删除


汉字UNICODE对应编码表www.chi2ko.com/tool/CJK.htm

0 0