在计算机中,所有的数据在存储和运算时都要采用二进制数值表示(由于计算机用高电平和低电平差别表示1和0),而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家假如要想互相通讯而不造成杂乱,那么大家就必要采用雷同的编码条例,这就是统一编码的原因。简朴来说编码就是字符与数值的对应关系。
下面我们详细介绍差异编码的编码条例和利用。
ASCII编码ASCII码是由美国有关的尺度化结构出台的,后来它被国际尺度化结构(International Organization for Standardization, ISO)定为国际尺度,称为ISO 646尺度。该尺度统一规定了常用字符(像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如:、!、+等)总共128个字符)如何用二进制数来表示。ASCII分为尺度ASCII 码采用7 位二进制数组合来表示128种字符和开拓ASCII的8 位二进制数组合来表示256种字符。
尺度ASCII0-127所涵盖的码称为尺度ASCII编码,如:空格SPACE是32(二进制00100000),大写的字母a是97(二进制01100001)。这128个符号(包括32个不能打印出来的管理符号),只占用了一个字节(8位)的后7位,最前面的一位统一规定为0。
下面是尺度ASCII码表:
开拓ASCII码后128个称为开拓ASCII码。开拓ASCII码许可将每个字符的第8 位用于确认附加的128 个不同凡响符号字符、外来语字母和图形符号;
下面是开拓ASCII码表:
在python中可以采用内置函数ord()察看单个字符的ASCII码,例如:
ord(a)
97ord() 函数实质是返回字符的 Unicode 码对应的十进制数值。例如
ord(国)
22269另外,ord()逆函数chr()察看编码对应的字符,例如:
chr(97)
a
chr(22269)
国GBK因为ASCII编码是不支持中文的,但又需要寻求一种编码方式来支持中文。于是,国人就定义了一套编码条例:当字符小于127位时,与ASCII的字符雷同,但当两个大于127的字符连接在一起时,就典型一个汉字,第一个字节称为高字节(从0xA1-0xF7),第二个字节为低字节(从0xA1-0xFE),这样大约可以组合7000多个简体汉字。这个条例叫做GB2312。
因为中国汉字许多,有些字还是无法表示,于是重新定义了条例:不在要求低字节一定是127之后的编码,只要第一个字节是大于127,就固定表示这是一个汉字的开端,不管后面跟的是不是开拓字符集里的内容。这种开拓之后的编码方案称之为GBK,涵盖了GB2312的所有内容,同时新增了近20000个新的汉字(包括繁体字)和符号。但是,中国有56个民族,每个民族都有自己的文字,所以,对GBK编码条例进行了开拓,又加了近几千个少数民族的字符,再次开拓后得编码叫做GB18030,GBK字符是被涵盖在GB18030字符内的,与GBK根本向后兼容。GB18030共收录汉字70,244个
Python中采用gbk和gb18030编码韩字:
韩encode(gb18030)
b\xba\xab
韩encode(gbk)
b\xba\xabANSI为使计算机支持更多的语言,通常采用 0x80~0xFFFF 范畴内的2个字节来表示1个字符。比如:汉字 中 在中文操纵系统中,采用0xD6、0xD0这两个字节存储。但差异的国家和地域制定了差异的尺度,由此发生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码尺度。这些采用多个字节来典型一个字符的各种延伸编码方式,被称为 ANSI 编码。在简体中文Windos操纵系统为中,ANSI 编码典型 GBK 编码;在繁体中文Windos操纵系统中,ANSI编码典型Big5;而在日文Windos操纵系统中,ANSI 编码典型 Shift_JIS 编码。差异 ANSI 编码之间互不兼容,当信息在国际间切磋时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。
Unicode由于世界上有许多国家,而每个国家都定义一套自己的编码尺度,结局相互之间无法分析编码进行通讯,所以ISO(国际尺度化结构)决择定义一套编码方案来解决所有国家的编码疑问,这个新的编码方案就叫做Unicode。留心Unicode不是一个新的编码条例,而是一套字符集(为每一个「字符」分配一个唯一的 (学名为码位 码点 Code Point)),可以将Unicode懂得为一本世界编码的字典。具体的符号对应表,可以查询,或者专门的汉字对应表。
在Python中察看字符对应Unicode数值的想法:
中encode(unicode_escape)
b\\u4e2d
b\\u4e2ddecode(unicode_escape)
中需要留心的是,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。比如,汉字严的 Unicode 是十六进制数4E25,转换成二进制数足足有15位(1001110 00100101),也就是说,这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。这里就有几个严重的疑问,第一个疑问是,计算机如何才能区别 Unicode 和 ASCII ?还有计算机怎么知道三个字节表示一个符号,而不是差别表示三个符号呢?第二个疑问是,我们已经知道,英文字母只用一个字节表示就够了,假如 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必定有二到三个字节是0,这对于存储或传输来说是极大的糟蹋,文本文件的大小会因此大出二三倍,这是无法承受的。它们造成的结局是:显露了 Unicode 的多种存储方式,也就是说有很多种差异的二进制形式,可以用来表示 Unicode。也导致了Unicode 在很长一段时间内无法推销,直到UTF编码的显露。
UTF-8编码因为Unicode对照糟蹋网络和硬盘资源,因此为了解决这个疑问,就在Unicode的底层上,定制了一套编码条例(将「码位」转换为字节序列的条例【编码解码 可以懂得为 加密解密 的过程】),这个新的编码条例就是UTF-8。UTF-8使用1-4个字符进行传输和存储数据,是一种针对Unicode的可变长度字符编码,又称万国码。
Unicode与Utf-8编码条例:采用下面的模板进行互转
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
Unicode字符通过对应模板加上标记位就后是Utf-8编。例如:迷 Unicode的编码为 \\u8ff7 用二进制表示为:10001111 11110111,8ff7处于第三个模板范畴内,把10001111 11110111 按模板分成三份 1000 111111 110111,然后加上标记位的二进制为:111010001011111110110111 所以utf-8编码是E8BFB7
Python中Unicode字符转UTF-8编码:
迷encode(utf-8)
b\xe8\xbf\xb7那么如何分辨utf-8各个字符的?utf-8分辨每个字符的开端是依据编码的高位字节来分辨的,比如:用一个字节表示的字符,第一个字节高位以0开头;用两个字节表示的字符,第一个字节的高位为以110开头,后面一个字节以10开头;用三个字节表示的字符,第一个字节以1110开头,后面两个字节以10开头;用四个字节表示的字符,第一个字节以11110开头,后面的三个字节以10开头。这样计算机就可以认出每个字符由几个字节构造,才能显示出正确的信息。
UTF-8和Unicode转换
比如汉字智,utf-8编码是\xe6\x99\xba对应的二进制为:11100110 10011001 10111010,因为utf-8中一个汉字是3个字节,所以对应的模板为:
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
11100110 10011001 10111010 | UTF-8编码成的二进制1110xxxx 10xxxxxx 10xxxxxx | 对应模版 0110 011001 111010 |去除模版中的标记位后01100110 01111010典型十六进制667A,因此依据条例转换得出智Unicode的编码为667A。
同样,依据Unicode中字符的编码位置,也能找到对应的utf-8编码。例如:UTF-8编码:\xe8\xbf\xb7,用二进制表示为:11101000 10111111 10110111,有3个字节属于第三个模板范畴,按模板去掉标记位后是:1000 111111 110111,结局就是迷字的Unicode字符8ff7。
b\\u8ff7decode(unicode_escape)
迷Unicode与GBK编码的转换Unicode 与 GBK 是两个彻底差异的字符编码方案, 其两者没有直接关系。假如要对其进行相
互转换, 最直接最高效的想法是查询各自的字符比较表。
Python实现Unicode与GBK转换(将Unicode对应数值:\\u8ff7转GBK字符想法):
l_u=b\\u8ff7decode(unicode_escape)
l_uencode(gbk)
b\xc3\xd4UTF-8、Unicode与GBK的关系
Utf-8(utf-16)====编码====Unicode=====编码=====GBK(ANSI)
Utf-8(utf-16)====解码====Unicode===解码=======GBK(ANSI)
结算:Unicode字符可以通过编码可以得到UTF-8和GBK,相反UTF-8和GBK也可以通过解码得到Unicode,但GBK和UTF-8之间无法直接转换,只能转换到Unicode后再转到另一编码。其实所谓编码转换是数值与字符的转换。
URL编码 解码URL编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上。比如\,它的ascii码是92,92的十六进制是5c,所以\的URL编码就是5c。那么汉字的URL编码呢?很简朴,非ASCII字符的编码一般有两种,是以GBK或UTF8进行编码。例如:迷 对应的UTF-8编码\xe8\xbf\xb7,则胡的URL编码是E8BFB7。解码想法是去掉,之后再进行UTF-8解码,就可以得到实际的字符了。
计算机是以什么编码存储和传输数据的呢?
支持Unicode的利用程序(python、VS、VC、Google Chrome、notepad等大多数程序都支持(部门程序需要设置编码)。
不支持Unicode的利用程序(易语言等)则会以管理面板—区域—控制中设置的编码(ANSI)进行存储,例如:简体中文(GBK)、繁体中文(Big5)等。
例如:以国产编程语言‘易语言’为例,看一下变量在内存中是以什么编码存储的
a=你
调试输出(取指针地址_文本型(a))
*1966420通过CE察看此内存地址中对应的值为0000E3C4,而你的GBK编码正好为:E3C4。由此得知,易语言软件是以GBK编码进行数据存储和传输的。
再看看数据在内存中如何存储:
·采用OD察看
·采用CE察看
多字符变量你好啊的GBK字符:c4e3bac3b0a1
OD
CE(8字节显示)
由此可以看出,内存的存储编码方式与软件支持的编码方式是一致的(易语言:GBK字符;python:Unicode字符);计算机内存数据存储一般使用大端模式(内存高位对数据低位,内存低位对数据高位) 。OD默认是从内存低位到高位显示数据,CE默认是从内存高位到低位显示数据,所以看到的十六进制数值是相反的。存储占用的内存大小,会依据变量的数据类型申请对应大小的内存来存储。
尺度ASCII 0-127所涵盖的码称为尺度ASCII编码,如:空格SPACE是32(二进制00100000),大写的字母a是97(二进制01100001)。这128个符号(包括32个不能打印出来的管理符号),只占用了一个字节(8位)的后7位,最前面的一位统一规定为0。 下面是尺度ASCII码表: 开拓ASCII码 后128个称为开拓ASCII码。开拓ASCII码许可将每个字符的第8 位用于确认附加的128 个不同凡响符号字符、外来语字母和图形符号; 下面是开拓ASCII码表: 在python中可以采用内置函数ord()察看单个字符的ASCII码,例如: ord() 函数实质是返回字符的 Unicode 码对应的十进制数值。例如 另外,ord()逆函数chr()察看编码对应的字符,例如: 因为ASCII编码是不支持中文的,但又需要寻求一种编码方式来支持中文。于是,国人就定义了一套编码条例:当字符小于127位时,与ASCII的字符雷同,但当两个大于127的字符连接在一起时,就典型一个汉字,第一个字节称为高字节(从0xA1-0xF7),第二个字节为低字节(从0xA1-0xFE),这样大约可以组合7000多个简体汉字。这个条例叫做GB2312。 因为中国汉字许多,有些字还是无法表示,于是重新定义了条例:不在要求低字节一定是127之后的编码,只要第一个字节是大于127,就固定表示这是一个汉字的开端,不管后面跟的是不是开拓字符集里的内容。这种开拓之后的编码方案称之为GBK,涵盖了GB2312的所有内容,同时新增了近20000个新的汉字(包括繁体字)和符号。但是,中国有56个民族,每个民族都有自己的文字,所以,对GBK编码条例进行了开拓,又加了近几千个少数民族的字符,再次开拓后得编码叫做GB18030,GBK字符是被涵盖在GB18030字符内的,与GBK根本向后兼容。GB18030共收录汉字70,244个 Python中采用gbk和gb18030编码韩字: 为使计算机支持更多的语言,通常采用 0x80~0xFFFF 范畴内的2个字节来表示1个字符。比如:汉字 中 在中文操纵系统中,采用0xD6、0xD0这两个字节存储。但差异的国家和地域制定了差异的尺度,由此发生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码尺度。这些采用多个字节来典型一个字符的各种延伸编码方式,被称为 ANSI 编码。在简体中文Windos操纵系统为中,ANSI 编码典型 GBK 编码;在繁体中文Windos操纵系统中,ANSI编码典型Big5;而在日文Windos操纵系统中,ANSI 编码典型 Shift_JIS 编码。差异 ANSI 编码之间互不兼容,当信息在国际间切磋时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。 由于世界上有许多国家,而每个国家都定义一套自己的编码尺度,结局相互之间无法分析编码进行通讯,所以ISO(国际尺度化结构)决择定义一套编码方案来解决所有国家的编码疑问,这个新的编码方案就叫做Unicode。留心Unicode不是一个新的编码条例,而是一套字符集(为每一个「字符」分配一个唯一的 (学名为码位 码点 Code Point)),可以将Unicode懂得为一本世界编码的字典。具体的符号对应表,可以查询,或者专门的汉字对应表。 在Python中察看字符对应Unicode数值的想法: 需要留心的是,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。比如,汉字严的 Unicode 是十六进制数4E25,转换成二进制数足足有15位(1001110 00100101),也就是说,这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。这里就有几个严重的疑问,第一个疑问是,计算机如何才能区别 Unicode 和 ASCII ?还有计算机怎么知道三个字节表示一个符号,而不是差别表示三个符号呢?第二个疑问是,我们已经知道,英文字母只用一个字节表示就够了,假如 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必定有二到三个字节是0,这对于存储或传输来说是极大的糟蹋,文本文件的大小会因此大出二三倍,这是无法承受的。它们造成的结局是:显露了 Unicode 的多种存储方式,也就是说有很多种差异的二进制形式,可以用来表示 Unicode。也导致了Unicode 在很长一段时间内无法推销,直到UTF编码的显露。 因为Unicode对照糟蹋网络和硬盘资源,因此为了解决这个疑问,就在Unicode的底层上,定制了一套编码条例(将「码位」转换为字节序列的条例【编码解码 可以懂得为 加密解密 的过程】),这个新的编码条例就是UTF-8。UTF-8使用1-4个字符进行传输和存储数据,是一种针对Unicode的可变长度字符编码,又称万国码。 Unicode与Utf-8编码条例:采用下面的模板进行互转 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 Unicode字符通过对应模板加上标记位就后是Utf-8编。例如:迷 Unicode的编码为 \\u8ff7 用二进制表示为:10001111 11110111,8ff7处于第三个模板范畴内,把10001111 11110111 按模板分成三份 1000 111111 110111,然后加上标记位的二进制为:111010001011111110110111 所以utf-8编码是E8BFB7 Python中Unicode字符转UTF-8编码: 那么如何分辨utf-8各个字符的?utf-8分辨每个字符的开端是依据编码的高位字节来分辨的,比如:用一个字节表示的字符,第一个字节高位以0开头;用两个字节表示的字符,第一个字节的高位为以110开头,后面一个字节以10开头;用三个字节表示的字符,第一个字节以1110开头,后面两个字节以10开头;用四个字节表示的字符,第一个字节以11110开头,后面的三个字节以10开头。这样计算机就可以认出每个字符由几个字节构造,才能显示出正确的信息。 比如汉字智,utf-8编码是\xe6\x99\xba对应的二进制为:11100110 10011001 10111010,因为utf-8中一个汉字是3个字节,所以对应的模板为: 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 11100110 10011001 10111010 | UTF-8编码成的二进制1110xxxx 10xxxxxx 10xxxxxx | 对应模版 0110 011001 111010 |去除模版中的标记位后01100110 01111010典型十六进制667A,因此依据条例转换得出智Unicode的编码为667A。 同样,依据Unicode中字符的编码位置,也能找到对应的utf-8编码。例如:UTF-8编码:\xe8\xbf\xb7,用二进制表示为:11101000 10111111 10110111,有3个字节属于第三个模板范畴,按模板去掉标记位后是:1000 111111 110111,结局就是迷字的Unicode字符8ff7。 Unicode 与 GBK 是两个彻底差异的字符编码方案, 其两者没有直接关系。假如要对其进行相 互转换, 最直接最高效的想法是查询各自的字符比较表。 Python实现Unicode与GBK转换(将Unicode对应数值:\\u8ff7转GBK字符想法): Utf-8(utf-16)====编码====Unicode=====编码=====GBK(ANSI) Utf-8(utf-16)====解码====Unicode===解码=======GBK(ANSI) 结算:Unicode字符可以通过编码可以得到UTF-8和GBK,相反UTF-8和GBK也可以通过解码得到Unicode,但GBK和UTF-8之间无法直接转换,只能转换到Unicode后再转到另一编码。其实所谓编码转换是数值与字符的转换。 URL编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上。比如\,它的ascii码是92,92的十六进制是5c,所以\的URL编码就是5c。那么汉字的URL编码呢?很简朴,非ASCII字符的编码一般有两种,是以GBK或UTF8进行编码。例如:迷 对应的UTF-8编码\xe8\xbf\xb7,则胡的URL编码是E8BFB7。解码想法是去掉,之后再进行UTF-8解码,就可以得到实际的字符了。 支持Unicode的利用程序(python、VS、VC、Google Chrome、notepad等大多数程序都支持(部门程序需要设置编码)。 不支持Unicode的利用程序(易语言等)则会以管理面板—区域—控制中设置的编码(ANSI)进行存储,例如:简体中文(GBK)、繁体中文(Big5)等。 例如:以国产编程语言‘易语言’为例,看一下变量在内存中是以什么编码存储的 通过CE察看此内存地址中对应的值为0000E3C4,而你的GBK编码正好为:E3C4。由此得知,易语言软件是以GBK编码进行数据存储和传输的。 再看看数据在内存中如何存储: ·采用OD察看 ·采用CE察看 多字符变量你好啊的GBK字符:c4e3bac3b0a1 OD CE(8字节显示) 由此可以看出,内存的存储编码方式与软件支持的编码方式是一致的(易语言:GBK字符;python:Unicode字符);计算机内存数据存储一般使用大端模式(内存高位对数据低位,内存低位对数据高位) 。OD默认是从内存低位到高位显示数据,CE默认是从内存高位到低位显示数据,所以看到的十六进制数值是相反的。存储占用的内存大小,会依据变量的数据类型申请对应大小的内存来存储。
ord(a)
97
ord(国)
22269
chr(97)
a
chr(22269)
国
GBK
韩encode(gb18030)
b\xba\xab
韩encode(gbk)
b\xba\xab
ANSI
Unicode
中encode(unicode_escape)
b\\u4e2d
b\\u4e2ddecode(unicode_escape)
中
UTF-8编码
迷encode(utf-8)
b\xe8\xbf\xb7
UTF-8和Unicode转换
b\\u8ff7decode(unicode_escape)
迷
Unicode与GBK编码的转换
l_u=b\\u8ff7decode(unicode_escape)
l_uencode(gbk)
b\xc3\xd4
UTF-8、Unicode与GBK的关系
URL编码 解码
计算机是以什么编码存储和传输数据的呢?
a=你
调试输出(取指针地址_文本型(a))
*1966420