昨天来源:cnblogs
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。ASCII 是一种字符编码,同时也是一种最简单的字符集编码,把128 个字符映射至整数0 ~ 127。
在 ASCII码里面,虽然你看到的是一个字符,但是对于计算机来说,存的就是二进制的整数,也就是说你看到的可能是abcd,但是计算机内部存的就是97 98 99 100。
ASCII这种7-bit 字符编码系统非常简单,在计算机中以一个字节存储一个字符。如下所示,
我安装了一个ascii
下面就是详细的信息:
[root@iZ28b4rx8dxZ ~]# yuminstall ascii [root@iZ28b4rx8dxZ ~]# ascii Usage: ascii [-dxohv] [-t] [char-alias...] -t = one-line output -d = Decimal table -o = octal table -x = hex table -h = This help screen -v = version information Prints all aliases of an ASCII character. Args may be chars, C \-escapes, English names, ^-escapes, ASCII mnemonics, or numerics indecimal/octal/hex. Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex 000 NUL 1610 DLE 3220483006440 @ 8050 P 9660 ` 11270 p 101 SOH 1711 DC1 3321 ! 493116541 A 8151 Q 9761 a 11371 q 202 STX 1812 DC2 3422" 50 32 2 66 42 B 82 52 R 98 62 b 114 72 r303 ETX 1913 DC3 3523 # 513336743 C 8353 S 9963 c 11573 s 404 EOT 2014 DC4 3624 $ 523446844 D 8454 T 10064 d 11674 t 505 ENQ 2115 NAK 3725 % 533556945 E 8555 U 10165 e 11775 u 606 ACK 2216 SYN 3826 & 543667046 F 8656 V 10266 f 11876 v 707 BEL 2317 ETB 3927' 55 37 7 71 47 G 87 57 W 103 67 g 119 77 w808 BS 2418 CAN 4028 ( 563887248 H 8858 X 10468 h 12078 x 909 HT 2519 EM 4129 ) 573997349 I 8959 Y 10569 i 12179 y 10 0A LF 26 1A SUB 42 2A * 58 3A : 74 4A J 90 5A Z 106 6A j 122 7A z 11 0B VT 27 1B ESC 43 2B + 59 3B ; 75 4B K 91 5B [ 107 6B k 123 7B { 12 0C FF 28 1C FS 44 2C , 60 3C < 76 4C L 92 5C \ 108 6C l 124 7C | 13 0D CR 29 1D GS 45 2D - 61 3D = 77 4D M 93 5D ] 109 6D m 125 7D } 14 0E SO 30 1E RS 46 2E . 62 3E > 78 4E N 94 5E ^ 110 6E n 126 7E ~ 15 0F SI 31 1F US 47 2F / 63 3F ? 79 4F O 95 5F _ 111 6F o 127 7F DEL [root@iZ28b4rx8dxZ ~]#截个图显示一下:
Latin-1
虽然ASCII好用,但是,很多时候一个字符用一个字节并不够。例如,各种符号和重音字符并不在ASCII所定义的可能字符的范围中,
为了容纳特殊字符,一些标准允许一个8位字节的所有bit都用来表示字符,那么,一个字节最多就可以表示255个字符了,这样的一个标准叫latin-1
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
因为Latin-1 编码范围使用了单字节内的所有空间,在支持Latin-1 的系统中传输和存储其他任何编码的字节流都不会被抛弃。换句话说就是把其他任何编码的字节流当作Latin-1 编码看待都没有问题。这是个很重要的特性,mysql数据库默认编码是Latin1就是利用了这个特性。
在latin-1中,127以上的字符代码分配给了重音和其他特殊字符
总结latin-1与ASCII的区别:1、在计算机里面一个字节是8位二进制,8位二进制可以表示255个字符,但是ASCII只有128个,也就是说第八位的那个bit是没有用的,只用到了后面的7个bit来表示ASCII,但是latin-1就把第八位的那个bit用到了,换句话说就是把一个字节的最高位的bit也使用上了。
2、latin-1虽然对ASCII进行了扩展,可以表示最多为256个字符,但是,它仅适合美国英语,甚至一些英语中常用的标点符号、重音符号都不能表示,无法表示各国语言,特别是中文等表意文字(一种用象征性书写符号记录词或词素的文字体系,不直接或不单纯表示语音。 )
GB 2312
GB 2312是一个简体中文汉字编码国家标准,GB2312对汉字采用双字节编码,由6763个常用汉字和682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。由于字符数量比较大,GB2312采用了二维矩阵编码法对所有字符进行编码。
BIG5编码台湾地区繁体中文标准字符集,采用双字节编码,也称为大五码,具体的信息我就不介绍了,百度上一堆
GBK编码1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
最一开始,在Unicode 出现之前,各地区国家制定了不同的编码系统,也就是说中文自己进行编码,如GB 2312 和大五码等,日文也自己进行编码,如主要用JIS ,这样会造成混乱不便,例如一个文本信息里面混合了不同的语言,就不能正确的表示信息,也就是无法进行混合的使用。
UnicodeUnicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字,以满足跨语言、跨平台进行文本转换、处理的要求。
统一码为每一个字符而非字形定义唯一的代码(即一个整数)。换句话说,统一码以一种抽象的方式(即数字)来处理字符,并将视觉上的演绎工作(例如字体大小、外观形状、字体形态、文体等)留给其他软件来处理,例如网页浏览器或是文字处理器
Unicode是为了解决传统的字符编码方案的局限而产生的
每个字符映射至一个整数码点(code point),码点的范围是0 至0x10FFFF,在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在Python中,用\uxxxx表示。所以有的时候用写Python的过程中看到了像\u四个十六进制的的字符的话,说明这个字符是Unicode。
其中Unicode 还制定了各种储存码点的方式,这些方式称为Unicode 转换格式(Uniform Transformation Format, UTF)。
现在流行的UTF 为UTF-8、UTF-16 和UTF-32。每种UTF 会把一个码点储存为一至多个编码单元(code unit)。例如UTF-8 的编码单元是8 位的字节、UTF-16 为16 位、UTF-32 为32 位。除UTF-32 外,UTF-8 和UTF-16 都是可变长度编码。
其中UTF-8 成为现在互联网上最流行的格式,有几个原因:
1、它采用8位编码,八位正好是一个字节,也就是说以字节为编码单元, 不会有字节序(大端模式,小端模式)的问题
大端模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中; 这和我们的阅读习惯一致。地址的增长顺序与值的增长顺序相反 小端模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。地址的增长顺序与值的增长顺序相同单字节的情况下不会出现大端小端的问题,比如说有两个字节,ab就要考虑是a放在前面还是b放在前面,对于大端的话就是a放前面,对于小端的话就是b放前面。我们常用的X86结构是小端模式
2、如果程序原来是以字节方式储存字符,理论上不需要特别改动就能处理UTF-8 的数据
3、每个ASCII 字符只需一个字节去储存
UTF-8的实现首先声明:utf8和Unicode并不是竞争的关系
UTF-8 的编码单元是8 位字节,每个码点编码成1 至4 个字节。它的编码方式很简单,按照码点的范围,把码点的二进位分拆成1 至最多4 个字节
UTF-8 编码方法的好处之一是,码点范围U+0000 ~ U+007F 编码为一个字节,与ASCII 编码兼容。这范围的Unicode 码点也是和ASCII 字符相同的。因此,一个ASCII 文本也是一个UTF-8 文本
也就是说Unicode编码成utf-8有自己的一套编码方法
用Python举个例子解释一下:
把“张三”编码成为utf-8
这其中的转换过程如下所示:
把5f20和4e09分别翻译成二进制然后转为utf-8
5f20:
翻译为二进制:
按照上面码点范围的转换方式,5f20 应该属于第三个范围 也就是 1110+0101(四位)+10+111100(六位)+10+100000(六位):
1110 0101 1011 1100 1010 0000
e 5 b c a 0
4e09:
翻译为二进制:
0100 1110 0000 1001
e 4 b 8 8 9
下一篇会在Python里面详细理解Unicode与utf-8