unicode字符表(ascii不同编码)

在计算机中,保存和运算所有数据时用二进制数值表示。 (因为计算机分别用高电平和低电平表示1和0 )。 具体用哪个二进制表示哪个符号,当然谁都可以约定自己的一套,但这叫做编码。 大家要想不混乱地互相通信,大家就必须使用同样的编码规则。 这就是统一代码的理由。 简单地说,代码是文字和数值的对应关系。 本文详细介绍了不同编码的编码规则和应用

ASCII编码

ASCII代码由美国相关的标准化组织发行,之后由国际标准化组织(internationalorganizationforstandardization,ISO )国际标准化,称为ISO 646标准该标准中,普通字符(包括a、b、c、d等52个字符和大写字母)以及0、1等数字中的普通符号) ),示例)!等)共128个字符) )如何用二进制数表示? ASCII分为标准的ASCII代码,使用7位二进制组合来表示128种字符,使用扩展的ascii 8位二进制组合来表示256种字符。

标准ASCII0-127中包含的代码被称为标准ASCII代码。 例如,空间为32 (二进制00100000 ),大写字母a为97 )二进制01100001。 这128个符号(包括不能打印的32个控制符号) )仅占用1字节(8比特)的低位7比特,开头的1比特一律确定为0。

以下是标准的ASCII代码表。

扩展ASCII码

以下128个被称为扩展ASCII码。 扩展ASCII码允许使用每个字符的第8位来确定添加的128个特殊符号字符、外来语字符和图形符号。

扩展的ASCII代码表如下所示。

在python中,可以使用内置函数ord (显示单个字符的ASCII代码,例如:

ord(a ) ) )。

97

ord ) )函数是一个十进制值,对应于实际返回字符的unicode。 例如

ord (国家) )。

22269

ord )反函数chr )显示与代码对应的字符。 示例:

我是chr(97岁)

‘ a ‘号运载火箭

我是CHR(2269 )

“国家”

GBK

的ASCII编码不支持中文,因此需要寻求支持中文的编码方式。 因此,国民定义了一系列的编码规则。 如果字符小于127位,则表示与ASCII的字符相同,但两个大于127的字符串联在一起,则表示汉字,第一个字节称为字节(0xA1-0xF7),第二个字节为字节)0xA1-0xFE )

由于中国的汉字很多,有些字还不能表达。 因此,重新定义了规则。 低字节没有必要一定是127最后的代码。 只要第一个字节大于127,不管是否扩展字符集的内容,它都固定地表达为汉字的开始。 这种扩展的编码方式被称为GBK,包含GB2312的所有内容,同时添加了近20000个新汉字(包括繁体字)和符号。 但是,中国有56个民族,每个民族都有自己的文字。 所以,我们扩展了GBK代码规则,进一步添加了近千个少数民族的文字。 重新扩展的代码称为GB18030,GBK字符包含在GB18030字符中,与GBK几乎向后兼容。 GB18030中一共收录了70,244个汉字。

Python使用gbk和gb18030对“韩”字符进行编码。

韩国.编码(‘ GB 18030 ‘ )

b’\xba\xab ‘。

韩国编码(GBK )

b’\xba\xab ‘。

ANSI:

通常使用0x80~0xFFFF范围内的2个字节来表示1个字符,以便计算机能够支持更多语言。 例如,汉字“中”在中文操作系统中使用0xD6、0xD0这2字节的存储。 但是,不同的国家和地区制定了不同的标准,从而产生了GB2312、GBK、GB18030、Big5、Shift_JIS等各自的编码标准。 使用这些多个字节表示单个字符的各种扩展代码方法称为ANSI代码。 在简体中文的Windows操作系统中,ANSI代码表示GBK代码。 在繁体中文的Windows操作系统中,ANSI代码表示Big5。 在日语Windows操作系统中,ANSI编码表示Shift_JIS编码。 不同的ANSI代码之间不兼容,如果信息在国际间交换,则不能属于

两种语言的文字,存储在同一段 ANSI 编码的文本中。ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。

Unicode

因为世界上有很多国家,而每个国家都定义一套自己的编码标准,结果相互之间无法解析编码进行通信,所以ISO(国际标准化组织)决定定义一套编码方案来解决所有国家的编码问题,这个新的编码方案就叫做Unicode。注意Unicode不是一个新的编码规则,而是一套字符集(为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)),可以将Unicode理解为一本世界编码的字典。具体的符号对应表,可以查询,或者专门的汉字对应表。

在Python中查看字符对应Unicode数值的方法:

>>> “中”.encode(“unicode_escape”)
b’\\u4e2d’
>>> b’\\u4e2d’.decode(“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,然后加上标志位的二进制为:11101000 10111111 10110111 所以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’\\u8ff7′.decode(‘unicode_escape’)
‘迷’

Unicode与GBK编码的转换

Unicode 与 GBK 是两个完全不同的字符编码方案, 其两者没有直接关系。如果要对其进行相

互转换, 最直接最高效的方法是查询各自的字符对照表。

Python实现Unicode与GBK转换(将Unicode对应数值:\\u8ff7转GBK字符方法):

>>> l_u = b’\\u8ff7′.decode(‘unicode_escape’)
>>> l_u.encode(‘gbk’)
b’\xc3\xd4′

UTF-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编码是%E8%BF%B7。解码方法是去掉%,之后再进行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默认是从内存高位到低位显示数据,所以看到的十六进制数值是相反的。存储占用的内存大小,会根据变量的数据类型申请对应大小的内存来存储。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注