上一节我们学了布尔值和比较运算符。这一节我们学什么呢?
这次的内容可能会有点抽象——编码。
目前常用的编码有ASCII码、统一码和utf-8码。
先从ASCII码讲起吧。
ASCII (American Standard Code for Information Interchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。 ——百度百科
我们可以用一个库来知道ASCII码中有哪些可打印字符。
这个必须在pyshell环境执行,不然看不到效果。
>>> import string #导入string库
>>>
>>> string.printable #输出ASCII码中的可打印字符
"""
控制台:
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
"""
是的,直接输入对象名也能输出,但我不推荐这样。
我们可以用chr()函数来获得二、八、十或十六进制数字表示的ASCII码或统一码的字符
#Program_28
int1 = 2 #将2赋值给变量int1
int2 = 52 #将52赋值给变量int2
hex1 = 0x6587 #将0x6587赋值给变量int3,用0b110010110000111、0o62607或25991代替0x6587也能起到一样的效果
print(chr(int1)) #输出变量int1代表的ASCII码字符
print(chr(int2)) #输出变量int2代表的ASCII码字符
print(chr(hex1)) #输出变量hex1代表的ASCII码字符
"""
控制台:
4
文
"""
嗯,奇怪的符号又增长了!
接下来是统一码。
统一码(Unicode),也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。 ——百度百科
一样,我们也能用函数来让我们获得统一码。
一个是chr(),另一个是ord()。
chr()我就不讲了,主要讲ord()。
ord()可以回传括号内字符串(字符串只能有一个字符!)的统一码码值。
#Program_29
str1 = "谢" #将"谢"赋值给变量str1
str2 = "博" #将"博"赋值给变量str2
str3 = "文" #将"文"赋值给变量str3
print(ord(str1)) #输出变量str1的值的统一码码值
print(ord(str2)) #输出变量str2的值的统一码码值
print(ord(str3)) #输出变量str3的值的统一码码值
"""
控制台:
35874
21338
25991
"""
ASCII码中的可打印字符在统一码中的编码是一样的。
接着是utf-8码。
UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部分修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。 ——百度百科
先别急,我先介绍两个函数:bytes()和bytearray()。这两个函数可以返回数字的bytes或bytearray值。
#Program_30
int_ = 10 #将10赋值给变量int_
print(bytes(int_)) #输出变量int_的值的bytes形式
print(bytearray(int_)) #输出变量int_的值的bytearray形式
"""
控制台:
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
"""
字符串也能转换成bytes形式,但我们不用bytes()函数,我们用encode()函数。
#Program_31
string = "turtle" #将"turtle"赋值给变量string
string_bytes = string.encode("utf-8") #将变量string的值转换为utf-8码,并将结果赋值给变量string_bytes
print(type(string_bytes)) #输出变量string_bytes的值的类型
print(string_bytes) #输出变量string_bytes的值
"""
控制台:
<class 'bytes'>
b'turtle'
"""
我们发现,英文单词的utf-8形式就是他本身。那中文呢?试试。
#Program_31_1
string = "乌龟" #将"乌龟"赋值给变量string
string_bytes = string.encode("utf-8") #将变量string的值转换为utf-8码,并将结果赋值给变量string_bytes
print(type(string_bytes)) #输出变量string_bytes的值的类型
print(string_bytes) #输出变量string_bytes的值
"""
控制台:
<class 'bytes'>
b'\xe4\xb9\x8c\xe9\xbe\x9f'
"""
结果显示,中文字符的bytes形式是乱码。
那怎么让乱码变回原来的字符串呢?
decode()可以解决这个问题!
#Program_32
string_bytes = b'\xe4\xb9\x8c\xe9\xbe\x9f' #将"b'\xe4\xb9\x8c\xe9\xbe\x9f'"赋值给变量string_bytes
string = string_bytes.decode("utf-8") #将变量string_bytes的值转换为字符串,并将结果赋值给变量string
print(type(string)) #输出变量string的值的类型
print(string) #输出变量string的值
"""
控制台:
<class 'str'>
乌龟
"""
哦,你可能注意到了,不管是encode()还是decode(),括号内都要填编码形式。
我们也可以把里面的utf-8变成utf-16或utf-32。
#Program_33
string = "乌龟" #将"乌龟"赋值给变量string
string_utf8 = string.encode("utf-8") #将变量string的值转换为utf-8码,并将结果赋值给变量string_utf8
string_utf16 = string.encode("utf-16") #将变量string的值转换为utf-16码,并将结果赋值给变量string_utf16
string_utf32 = string.encode("utf-32") #将变量string的值转换为utf-32码,并将结果赋值给变量string_utf32
print(type(string_utf8)) #输出变量string_utf8的值的类型
print(type(string_utf16)) #输出变量string_utf16的值的类型
print(type(string_utf32)) #输出变量string_utf32的值的类型
print(string_utf8) #输出变量string_utf8的值
print(string_utf16) #输出变量string_utf16的值
print(string_utf32) #输出变量string_utf32的值
"""
控制台:
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
b'\xe4\xb9\x8c\xe9\xbe\x9f'
b'\xff\xfeLN\x9f\x9f'
b'\xff\xfe\x00\x00LN\x00\x00\x9f\x9f\x00\x00'
"""
你可能会问了:这个bytes类型到底有什么用啊?
用过微信吧?你在微信里输入的基本上都是中文吧?
你发送后,微信要把你输入的数据转化为bytes数据,发送到对方的手机(平板或电脑)上,然后再解码,转换为中文(谁也不想看乱码,对吧)。
好了,今天的作业:将Program_33中我输出的三个bytes数据解码。
我是谢pro,再见~