码迷,mamicode.com
首页 > 其他好文 > 详细

梳理各种编码

时间:2015-02-24 09:09:51      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:unicode   二进制   编码   

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

文章是对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码表

Bin Dec Hex 缩写/字符 解释
00000000 0 00 NUL(null) 空字符
00000001 1 01 SOH(start of headling) 标题开始
00000010 2 02 STX (start of text) 正文开始
00000011 3 03 ETX (end of text) 正文结束
00000100 4 04 EOT (end of transmission) 传输结束
00000101 5 05 ENQ (enquiry) 请求
00000110 6 06 ACK (acknowledge) 收到通知
00000111 7 07 BEL (bell) 响铃
00001000 8 08 BS (backspace) 退格
00001001 9 09 HT (horizontal tab) 水平制表符
00001010 10 0A LF (NL line feed, new line) 换行键
00001011 11 0B VT (vertical tab) 垂直制表符
00001100 12 0C FF (NP form feed, new page) 换页键
00001101 13 0D CR (carriage return) 回车键
00001110 14 0E SO (shift out) 不用切换
00001111 15 0F SI (shift in) 启用切换
00010000 16 10 DLE (data link escape) 数据链路转义
00010001 17 11 DC1 (device control 1) 设备控制1
00010010 18 12 DC2 (device control 2) 设备控制2
00010011 19 13 DC3 (device control 3) 设备控制3
00010100 20 14 DC4 (device control 4) 设备控制4
00010101 21 15 NAK (negative acknowledge) 拒绝接收
00010110 22 16 SYN (synchronous idle) 同步空闲
00010111 23 17 ETB (end of trans. block) 传输块结束
00011000 24 18 CAN (cancel) 取消
00011001 25 19 EM (end of medium) 介质中断
00011010 26 1A SUB (substitute) 替补
00011011 27 1B ESC (escape) 溢出
00011100 28 1C FS (file separator) 文件分割符
00011101 29 1D GS (group separator) 分组符
00011110 30 1E RS (record separator) 记录分离符
00011111 31 1F US (unit separator) 单元分隔符
00100000 32 20 (space) 空格
00100001 33 21 !  
00100010 34 22 "  
00100011 35 23 #  
00100100 36 24 $  
00100101 37 25 %  
00100110 38 26 &  
00100111 39 27  
00101000 40 28 (  
00101001 41 29 )  
00101010 42 2A *  
00101011 43 2B +  
00101100 44 2C ,  
00101101 45 2D -  
00101110 46 2E .  
00101111 47 2F /  
00110000 48 30 0  
00110001 49 31 1  
00110010 50 32 2  
00110011 51 33 3  
00110100 52 34 4  
00110101 53 35 5  
00110110 54 36 6  
00110111 55 37 7  
00111000 56 38 8  
00111001 57 39 9  
00111010 58 3A :  
00111011 59 3B ;  
00111100 60 3C <  
00111101 61 3D =  
00111110 62 3E >  
00111111 63 3F ?  
01000000 64 40 @  
01000001 65 41 A  
01000010 66 42 B  
01000011 67 43 C  
01000100 68 44 D  
01000101 69 45 E  
01000110 70 46 F  
01000111 71 47 G  
01001000 72 48 H  
01001001 73 49 I  
01001010 74 4A J  
01001011 75 4B K  
01001100 76 4C L  
01001101 77 4D M  
01001110 78 4E N  
01001111 79 4F O  
01010000 80 50 P  
01010001 81 51 Q  
01010010 82 52 R  
01010011 83 53 S  
01010100 84 54 T  
01010101 85 55 U  
01010110 86 56 V  
01010111 87 57 W  
01011000 88 58 X  
01011001 89 59 Y  
01011010 90 5A Z  
01011011 91 5B [  
01011100 92 5C \  
01011101 93 5D ]  
01011110 94 5E ^  
01011111 95 5F _  
01100000 96 60 `  
01100001 97 61 a  
01100010 98 62 b  
01100011 99 63 c  
01100100 100 64 d  
01100101 101 65 e  
01100110 102 66 f  
01100111 103 67 g  
01101000 104 68 h  
01101001 105 69 i  
01101010 106 6A j  
01101011 107 6B k  
01101100 108 6C l  
01101101 109 6D m  
01101110 110 6E n  
01101111 111 6F o  
01110000 112 70 p  
01110001 113 71 q  
01110010 114 72 r  
01110011 115 73 s  
01110100 116 74 t  
01110101 117 75 u  
01110110 118 76 v  
01110111 119 77 w  
01111000 120 78 x  
01111001 121 79 y  
01111010 122 7A z  
01111011 123 7B {  
01111100 124 7C |  
01111101 125 7D }  
01111110 126 7E ~  
01111111 127 7F DEL (delete) 删除


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

梳理各种编码

标签:unicode   二进制   编码   

原文地址:http://blog.csdn.net/u013480667/article/details/43918409

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!