计算机内全部信息都是使用0和1进行表示的。html
对于一个短路来讲,0表明关,1表明开。那把这些电路组合起来就能够有长串0和1组成的二进制数字,咱们对这些数字进行编码和解码,咱们就能用它来表示咱们想要表示的东西了。windows
好比:文字、图像、视频等等,就是一组0和1的二进制序列数组
8位二进制表示1字节网络
二进制太长,通常转换为16进制表示。可使用“8421法”,进行转换。ui
4位二进制能够转为1位十六进制(1111=>F),2位十六进制表示一字节编码
1,在 ASCII 阶段,单字节字符串使用一个字节存放一个字符(SBCS)。好比,"Bob123" 在内存中为:spa
42 6F 62 31 32 33 21 //ascii编码操作系统
B o b 1 2 3 ! //字符 code
2,在使用 ANSI 编码支持多种语言阶段,每一个字符使用一个字节或多个字节来表示(MBCS),所以,
这种方式存放的字符也被称做多字节字符。每一个汉字占2个字节,每一个英文和数字字符占1个字节:视频
D6 D0 CE C4 31 32 33 00
中 文 1 2 3 \0
3, 在 UNICODE 被采用以后,计算机存放字符串时,改成存放每一个字符在 UNICODE 字符集中的序号。
目前计算机通常使用 2 个字节(16 位)来存放一个序号(DBCS),所以,这种方式存放的字符也被称做宽字节字符。好比,字符串 "中文123" 在 Windows 下,内存中实际存放的是 5 个序号:
u4e2d u6587 u0031 u0032 u0033 (x64 大端序)
u2d4e u8765 u3100 u3200 u3300 (x86 小端序)
中 文 1 2 3
汉子 ‘中’ u4e2d 11101001 10110001 1001101
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示全部的大写和小写字母,数字0 到九、标点符号, 以及在美式英语中使用的特殊控制字符。
其中:
1, 0~31及127(共33个)是控制字符或通讯专用字符(其他为可显示字符),如控制符:LF(换行)、CR(回车)等
2, 32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。
65~90为26个大写英文字母,97~122号为26个小写英文字母,其他为一些标点符号、运算符号等。
3 , 在标准ASCII中,其最高位(b7)用做奇偶校验位。所谓奇偶校验,是指在代码传送过程当中用来检验是否出现错误的一种方法,通常分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。
4, 后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码容许将每一个字符的第8 位用于肯定附加的128 个特殊符号字符、外来语字母和图形符号。[4]
计算机技术到了欧洲,欧洲人发现怎么咱们的那么多符号没有编进去啊!因此欧洲"砖家"坐到了一块儿,开始讨论。发现既然美国人把第一位流出来了,那么咱们就用128-255的位置好了。
规则:128-159之间为控制字符,160-255位文字符号,其中包括了西欧语言、希腊语、泰语、阿拉伯语、希伯来语。恰好把美国人给的空间所有用完,世界真美好,谢谢美利坚预留的每个位置。砖家们决定把他们的编码名称叫作Latin1,后面因为欧洲统一制定ISO标准,因此又有了一个ISO的名称,即ISO-8859-1。
实现方式
• 0-127的全部位置不动,那么能够兼容ASCII,二进制位0xxx xxxx • 128-255位置所有用完,二进制位1xxx xxxx
因为全部的位置所有用完,而欧元符号是在指定标准以后才出现的,因此在这个码表中连欧洲人本身的货币符号都没有办法放进去。
计算机技术固然也传到了亚洲大地,好比中国。
中国砖家们坐在一块儿发现,美国人搞的这个东西真的有问题,预留才128-255的空间,但是咱们的汉字个数远远超出了这个数目啊,怎么办??后面聪明的中国砖家们发现,只能使用2个字节了,不然真的搞不定。因为必须和美国原来制定的ASCII不冲突,因此指定了以下规则:
• 若是一个字节中第一位为0,那么这就是一个ASCII字符。 • 若是一个字节中第一位为1,那么这个是汉字,认定须要2个字节才表示一个编码的文字。
把这个码表叫GB2312这个码表中包含汉字6763个和非汉字图形字符682个。还有不少的空间没有用到,索性所有预留了吧。实现方式
• 0xxxxxxx:表示为ASCII字符 • 1xxxxxxx 1xxxxxxx:表示为汉字
后来,中国砖家们发现,不少的不经常使用汉字没有在码表中,因而添加了不少的汉字进去,这个编码叫作GBK,实现方式和GB2312是彻底同样的,兼容GB2312,固然也兼容ASCII。实现方式
• 0xxxxxxx:表示为ASCII字符 • 1xxxxxxx xxxxxxxx:表示为汉字
后面再次添加更多的字符进去,再次命名为GB18030,兼容GBK。因为汉字不少,2个字节并不能彻底包括进去,因此GB18030采用24位混编的形式。
详细编码表能够参考这个列表。
固然计算机也传到了日本(JIS)、韩国、台湾(BIG5)等等地方,你们所有发挥本身的聪明才智,各自实现了本身的编码。这些编码都与ASCII兼容,可是相互之间不兼容。
使用 2 个字节来表明一个字符的各类汉字延伸编码方式,称为 ANSI 编码,又称为"MBCS(Muilti-Bytes Charecter Set,多字节字符集)”。
在简体中文系统下,ANSI 编码表明 GB2312 编码,在日文操做系统下,ANSI 编码表明 JIS 编码,因此在中文 windows下要转码成gb2312,gbk只须要把文本保存为ANSI编码便可。 不一样ANSI编码之间互不兼容
GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。
GB 2312的出现,基本知足了汉字的计算机处理须要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。
对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这致使了后来GBK及GB 18030汉字字符集的出现。
GB2312编码就是基于区位码的,用双字节编码表示中文和中文符号。
通常编码方式是:0xA0+区号,0xA0+位号。
以下表中的 “啊”,区位号是1601(十进制),那么“啊”字的GB2312编码就是 0xA0+16 0xA0+01 也就是 0xB0 0xA1 。根据区位码表,GB2312的汉字编码范围是0xB0A1~0xF7FE
http://www.xuebuyuan.com/8790...
区位码里有英文和数字,按道理说是否是也应该是双字节的呢。而通常状况下,咱们见到的英文和数字是单字节的,以ASCII编码,也就是说现代的GBK编码是兼容ASCII编码的。
好比一个数字2,对应的二进制是0x32,(00110010),ASCII的2是半角的二
2(区位码:0318) 0xA3 0xB2。(10100011 10110010)这里的双字节2是全角的二,
同一个编码文件里,怎么区分ASCII和中文编码呢?从ASCII表咱们知道标准ASCII只有128个字符,0~127即0x00~0x7F(0111 1111)。因此区分的方法就是,高字节的最高位为0则为ASCII,为1则为中文。
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。
Unicode 是为了解决传统的字符编码方案的局限而产生的
它为每种语言中的每一个字符设定了统一而且惟一的二进制编码,以知足跨语言、跨平台进行文本转换、处理的要求。
1990年开始研发,1994年正式公布
字节序是指多字节数据在计算机内存中存储或者网络
传输时各字节的存储顺序。
字节序有两种,分别是“大端”(Big Endian, BE)和“
小端”(Little Endian, LE)。
CPU处理多字节数的不一样方式。例如“汉”字的Unicode编码是6C49。
大端 6C49 (将高序字节存储在起始地址)
小段 496C (将低序字节存储在起始地址)
Unicode标准建议用BOM(Byte Order Mark)来区分字节序,即在传输字节流前,先传输被做为BOM的字符“零宽无中断空格”。这个字符的编码是FEFF,而反过来的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定义的码位,不该该出如今实际传输中。
UTF-8以字节为编码单元,没有字节序的问题。
UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每一个编码单元的字节序。
例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。
若是咱们收到UTF-16字节流“594E”,那么这是“奎”仍是“乙”?
Unicode规范中推荐的标记字节顺序的方法是BOM,即Byte Order Mark。
UTF-8是UNICODE的一种变长度的编码表达方式,
UTF-8就是以8位为单元对UCS(Unicode Character Set)进行编码,而UTF-8不使用大尾序和小尾序的形式,每一个使用UTF-8存储的字符,除了第一个字节外,其他字节的头两个比特都是以”10”开始,使文字处理器可以较快地找出每一个字符的开始位置。
第一种:Unicode从 0x0000 到 0x007F 范围的,是否是有点熟悉?对,其实就是标准ASCII码里面的内容,因此直接去掉前面那个字节 0x00,使用其第二个字节(与ASCII码相同)做为其编码,即为单字节UTF8。
第二种:Unicode从 0x0080 到 0x07FF 范围的,转换成双字节UTF8。
第三种:Unicode从 0x8000 到 0xFFFF 范围的,转换成三字节UTF8,通常中文都是在这个范围里。
例如“博”字的Unicode编码是u535a。0x535A在0x0800~0xFFFF之间,因此用3字节模板 1110yyyy 10yyyyxx 10xxxxxx。将535A写成二进制是:0101 0011 0101 1010,高八位分别代替y,低八位分别代替x,获得 11100101 10001101 10011010,也就是 0xE58D9A ,这就是博字的UTF8编码。
第四种:超过双字节的Unicode目前尚未普遍支持,仅见emoji表情在此范围。
转换的时候,将三个byte的数据,前后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。而后,每次取出6(由于2^6=64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符做为编码后的输出。不断进行,直到所有输入数据转换完成。这么看来,跟URLEncode也颇有类似之处啊。