梳理各种编码

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

文章是对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)设备控制1
000100101812DC2 (device control 2)设备控制2
000100111913DC3 (device control 3)设备控制3
000101002014DC4 (device control 4)设备控制4
000101012115NAK (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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值