⾼中信息技术(Python)重难点2:字符编码
本⽂章原⽂地址:,原⽂体验更佳
字符编码在近两年⾼考中分别在20年1⽉、21年1⽉和21年6⽉选择题第4题出现,往往和⼀起出现。较为重要。
⼀、编码概述
编码(Encoding)是信息按照某种规则或格式,从⼀种形式转换为另⼀种形式的过程。解码是编码的逆过程。
计算机对信息进⾏存储、加⼯、传递等处理,实际上是对信息的载体——数据进⾏处理。数据的表现形式可以是⽂本、图形、图像、声⾳、视频等,但不管是哪种形式的数据,最终存储在计算机中的都是经过⼀定规则编码后的⼆进制数字。
⼆、ASCII码
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是⼀套基于拉丁字母的计算机编码系统,主要⽤于显⽰现代英语和其他西欧语⾔。它由电报码发展⽽来,是现今最通⽤
的单字节编码系统。基本的ASCⅢ码共有128个,⽤1个字节中的低7位编码。⼆进制范围为000000111111,即⼗六进制的00H~7FH。基本的ASCⅢ码由33个控制字符、10个阿拉伯数字、26个英⽂⼤写字母、26个英⽂⼩写字母与些标点符号、运算符号组成。
,建议收藏。
常⽤的有空格为32(20H),'0'为48(30H),'A'为65(41H),'a'为97(61H),'A'与'a'相差32(20H)。
给定⼀个字符,想要获取其ASCII码怎么做呢?可以使⽤Python内置的ord函数,字符型->整型可以⽤ord函数。对应题⽬为
ord()函数
ord函数以⼀个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值
TZOJ5885参考代码
a=input()
print(ord(a))
若知道ASCII值,能转换为字符吗?可以使⽤Python内置的chr函数,整型->字符型可以⽤chr函数。对应题⽬为
chr函数
chr() ⽤⼀个范围在256内的整数作参数,返回⼀个对应的字符。
5889参考代码
# 注意输⼊的类型为int
a=int(input())
print(chr(a))
你可以尝试下以下题⽬
⼩z与ASCII加密、⼩z与ASCII解密、 C语⾔实验题――⼤⼩写转换、 C语⾔实验题――字符编码
要想显⽰出字母,系统中还必须装有相应的字库(Font,⼜称字型)。字库中存储了每个字符的形状信息,如字母'A'的点阵字符如下所⽰
可以尝试下。
字库分为点阵字符和⽮量字符,⽮量字符记录的是字符的笔画,具有存储空间⼩、美观的优点。
三、汉字编码
计算机中的汉字是采⽤⼆进制进⾏编码的。汉字编码分为外码、交换码、机内码和字形码。
外码:⼜称输⼊码,是⽤来将汉字输⼊到计算机中的⼀组键盘符号。常⽤的输⼊码有拼⾳码、五笔字形码等。
交换码:⼜称国标码,是和别的计算机交换信息时使⽤的编码。
机内码:根据国标码的规定,每⼀个汉字都有确定的⼆进制代码,在计算机内部汉字代码都⽤机内码,在磁盘上记录存储汉字代码也使⽤机内码。它们的集合就叫字符集。
字形码:⼜称输出码、汉字字模,把⼆进制的汉字编码还原为可视的图形,将其显⽰出来,它们的集合⼜叫字库。
四、GB2312编码
为了解决计算机的汉字显⽰问题,国家标准化管理委员会发布了GB/T 2312-1980,简称GB 2312。在GB 2312字符集中,1个汉字在计算机中⽤2个字节表⽰。如下图中的"中国China"这⼏个字符,其中"中国"两个汉字的内码为D6 DO B9 FA,⽽英⽂字符"China"是ASCII字符,其中每个字母都⽤1个字节编码表⽰。
图⽚中使⽤的软件是UltraEdit,使⽤Python可以直接将其内码依次显⽰。
a='中国China'
# 使⽤gb2312进⾏编码
de('gb2312')
# 依次输出每个字节的值
for i in a:
# 使⽤16进制输出
print("%02X" % i,end=" ")
GB 2312标准共收录6763个汉字,其中⼀级汉字3755个,⼆级汉字3008个。GB 2312的出现,基本满⾜了汉字的计算机处理需要,它所收录的汉字已经覆盖中国⼤陆99.75%的使⽤频率。
使⽤GB 2312时采⽤EUC-CN(Extended Unix Code)储存⽅法,以便兼容于ASCII。ASCII取值范围00H~7FH,两个连续的⼤于7FH的字符连接在⼀起就表⽰汉字。
同时,GB 2312收录了包括⼀般符号、数字、希腊字母、⽇⽂假名、俄⽂字母等在内的682个字符。ASCII码内本来就有的标点、数字、字符等在GB 2312中依旧被编码了,我们把他们称为全⾓字符,ASCII内就叫做半⾓字符,他们在计算机显⽰是不⼀样的,全⾓字符往往要宽⼀点。
想要更进⼀步了解GB2312的区位码可以尝试下
五、* GBK编码
GB 2312中虽然已有6763个汉字,但是像有些⽣僻字"珽"以及繁体字"甦"等均⽆法显⽰。如果系统所⽤的是GB 2312,遇到这些字往往不能显⽰。还有1万多个汉字和需要编码,于是⼈们就想到了扩充,发布了《汉字内码扩展规范》,简称GBK(国标扩展)。GBK 向下与 GB 2312编码兼容,向上⽀持 ISO 10646.1国际标准(国际标准组织ISO公布的通⽤字符集UCS),,它与 Unicode 组织的 Unicode 编码完全兼容。第⼀个字节还满⾜⼤于7FH,第⼆个字节范围为40H到FEH。
使⽤Python查看其gbk内码时把上⽂代码中的encode设为gbk即可。
a='甦'
中文字符unicode查询# 使⽤gbk进⾏编码
de('gbk')
# 依次输出每个字节的值
for i in a:
# 使⽤16进制输出
print("%02X" % i,end=" ")
六、* GB18030编码
为了解决中⽂、国内少数民族⽂字、⽇⽂以及朝鲜语等的编码,国家标准化管理委员会⼜发布了GB 18030,现⾏标准为GB18030-2005,GB/T 2312-1980⾃2017年3⽉23⽇起转化为推荐性标准,不再强制执⾏。
GB 18030包含三种长度的编码:单字节的ASCII、双字节的GBK(略带扩展)、以及⽤于填补所有Unicode码位的四字节UTF区块。
七、Unicode字符集
随着互联⽹的快速发展,各国之间的交流由于语⾔不同成为障碍,能否设计出让650种语⾔都兼容的字符集呢,Unicode协会将所有这些语⾔字符统⼀为⼀套字符集解决了这个问题。
Unicode字符集⼜称万国码,往往⽤U+⼀个16进制数字表⽰,⽬前已经编码到10FFFFH,货币元¥为U+00A5,实⼼电话☎为U+260E,汉字烦为U+70E6,表情喜极⽽泣 为U+1F602。
具体每个字符编码值可以到查询
使⽤Python代码可以查到每个字符的Unicode符号值。
a='中国¥☎ '
# 使⽤unicode-escape编码集
de('unicode-escape')
print(a)
⼋、* UTF-8编码
Unicode字符集只规定了字符与码表的⼀⼀对应关系,却没有规定该如何实现,因此这个字符集有多种实现⽅式(UTF-8,UTF-18,UTF-32),常见的实现⽅式是UTF-8。
UTF-8采⽤变长的编码⽅式实现,其节省空间,兼容ASCII标准的优点,在互联⽹上使⽤最⼴的⼀种Unicode的实现⽅式。
UTF-8 的编码规则很简单,只有⼆条:
1.对于单字节的符号,字节的第⼀位设为0,后⾯7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2.对于n字节的符号(n > 1),第⼀个字节的前n位都设为1,第n + 1位设为0,后⾯字节的前两位⼀律设为10。剩下的没有提及的⼆进制位,全部为这个符号的 Unicode 码。
Python代码依旧可以查出其utf-8编码值
a='烦'
# 使⽤utf-8进⾏编码
de('utf-8')
# 依次输出每个字节的值
for i in a:
# 使⽤16进制输出
print("%02X" % i,end=" ")
汉字的长度从2字节变为3字节了,所以实际在⽹络传输中还是会使⽤其Unicode值进⾏传输的,⽽且我们也不知道⽤户使⽤什么编码,⽐如json中汉字为\u+四位⼗六进制数。
规定UTF-8编码规则能不能写出其转换程序呢?等你来尝试。
九、Base64编码
Base64编码是计算机中常见的⼀种编码⽅式,规则是把3个字节(24位)的数据按6位1组分成4组(24÷6=4),然后将每组数据分别转换为⼗进制,根据下图将这些⼗进制数所对应的字符连接,即为Ba
se64编码。
以编码字符“Web”为例,如下图所⽰,字符“Web”对应的ASCI 编码分别是87,101,98,分别转换为8位⼆进制数,按6位⼆进制数分组后再
转换成⼗进制,査它们的对应字符,得到“Web”的Base64编码为“V2Vi”。
给你⼀个长度是3的倍数的字符串,请你出其Base64编码的值。
这个过程实际上就是进制转换的过程,可以写出如下代码7212参考代码1
也可以使⽤Python 内置的base64模块
7212参考代码2
如果原始的字节数不是3的倍数,⽐如4字节(剩余1字节)或者5字节(剩余2字节),则需要再末尾处理,⼀共可以分为2种情况。
1.如果剩余1字节,需要补2字节(16bit )才是3的倍数。也就是要则补16个0,加上前⾯剩余的1字节
(8bit ),⼀共是24个bit ,其中24个bit 的前12bit (2*6)构成两个base64字符,剩下的12bit (2*6)全部是0,⽤两个等号 == 表⽰。
2.如果剩余2字节,需要补1字节(8bit )才是3的倍数。也就是要则补8个0,加上前⾯剩余的2字节(16bit ),⼀共是24个bit ,其中24个bit 的前18bit (3*6)构成三个base64字符,剩下的6bit (1*6)全部是0,⽤⼀个等号 = 表⽰。
了解了以上规则, 等你来AC 。
# base64表
base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-"
a=input()
# 3位⼀处理
for i in range(0,len(a),3):
# 连续的3位按照256进制转换为数字
x=ord(a[i])*256*256+ord(a[i+1])*256+ord(a[i+2])
# 按照64进制转换回去
print(base64_table[x//64//64//64],
base64_table[x//64//64%64],
base64_table[x//64%64],
base64_table[x%64],
end="",sep="")
编码会了,解码要不要尝试⼀下呢? Base64编码解码简单版、 Base64编码解码
⼗、⼩结
计算机表⽰数字数字⾮常⽅便,但是遇到字符却不太好表⽰,发明计算机的美国⼈使⽤ASCII码表⽰英⽂以及控制字符等。等到中国⼈要⽤时,并没有我们的汉字,国家标准化管理委员会发布了GB 2312,但是其囊括汉字有限,微软推出了GBK。国家标准化管理委员会⼜发布了GB 18030,完全兼
容GBK。后来发布的均兼容之前的,所以只要是上述出现的编码,使⽤GB 18030就不会出现乱码了。
每个国家都可以⾃⼰制定⼀套编码⾃⼰使⽤,为了世界不同语⾔的可以交流,我们发明了Unicode字符集。Unicode为了包含所有⽂字,使⽤更多位的字节的表⽰。对于有些⽂字使⽤多字节是⽐较浪费的,⽐如数字1,在ASCII码中使⽤⼀个字节就能够表⽰,在Unicode中有可能就是多字节表⽰,⾮常浪费存储。UTF-8是Unicode的⼀种实现⽅式。实际情况使⽤变字节的来表⽰⽂字。使⽤1~4个字节表⽰⼀个字符,根据不同的字符⽽变化字节长度,当字符在ASCII 码的范围时,就⽤⼀个字节表⽰,⽽⼀个中⽂字符占3个字节。这个和我们中⽂GB的编码是不同的,所以会出现乱码。不过UTF-8编码也兼容ASCII码,所以⾥⾯的英⽂是可以正常显⽰的。
参考:
1. GB2312、GBK、GB18030 这⼏种字符集的主要区别是什么?
2. 标准号:GB/T 2312-1980 中⽂标准名称:信息交换⽤汉字编码字符集基本集
3. 标准号:GB 18030-2005 中⽂标准名称:信息技术中⽂编码字符集
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论