我与你,一同学Python(10)

上一节我们学了布尔值和比较运算符。这一节我们学什么呢?

这次的内容可能会有点抽象——编码。

目前常用的编码有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,再见~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值