习题23 字符串,字节串和字符编码
# 将argv解包,与之前的形式不太一样,但内容相同,
import sys
script, encoding, error = sys.argv
# 定义main函数,含三个变量
def main(language_file, encoding, errors):
# 每次读取文件的一行,赋值给line变量
line = language_file.readline()
# 做line的if语句,若语句为真,运行以下两行语句。若语句为假,跳过
if line:
# 调用print_line函数
print_line(line, encoding, errors)
# 返回main函数【在main里调用main函数,利用if函数终止循环】
return main(language_file, encoding, errors)
# 定义print_line函数,含三个参数
def print_line(line, encoding, errors):
# .strip()用来移除换行符
next_lang = line.strip()
# 将移除换行符后得到的字符串编码成字节串,赋值给raw_bytes
raw_bytes = next_lang.encode(encoding, errors = errors)
# 将刚才得到的字节串解码
cooked_string = raw_bytes.decode(encoding, errors = errors)
# 打印字节串和对应的字符串
print(raw_bytes, "<===>", cooked_string)
# 打开目标文件,编码方式为utf-8
languages = open("languages.txt", encoding = "utf-8")
# 对打开的文件对象调用main函数
main(languages, encoding, error)
## 回到第7行运行main函数,languages对应language_file, encoding对应encoding, error对应errors
## 此处的languages是打开文件“languages.txt”得到的文件对象,encoding和error都是最开始解包导入的参数
## 阅读languages文件的内容并将其赋值给line
## 因为line返回内容,所以第12行if语句判断为真,继续运行接下来的语句,运行print_line函数
## 跳到14行运行print_line函数,将第9行得到的line变量去掉换行符得到next_lang变量
## 将next_lang变量编码成字节串,得到新变量raw_bytes
## 将raw_bytes解码得到新变量cooked_string
## 打印raw_bytes及对应的cooked_string
## print_line函数运行完毕,回到第16行返回main函数
## 重新回到第7行,进行循环
## 直到文件读取至最后一行后,line不返回内容,所以第12行if语句判断为假,停止执行return语句。
## 循环结束,代码执行完毕
原结果超长,选择最后一小段做示范
b'\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x88' <===> اردو
b'Ti\xe1\xba\xbfng Vi\xe1\xbb\x87t' <===> Tiếng Việt
b'V\xc3\xb5ro' <===> Võro
b'\xe6\x96\x87\xe8\xa8\x80' <===> 文言
b'\xe5\x90\xb4\xe8\xaf\xad' <===> 吴语
b'\xd7\x99\xd7\x99\xd6\xb4\xd7\x93\xd7\x99\xd7\xa9' <===> ייִדיש
b'\xe4\xb8\xad\xe6\x96\x87' <===> 中文
1字节(byte)
1字节(byte)== 8位,就是二进制的8位数,计算机可以用8位数编写256个数字,00000000代表0、11111111代表255,0~255总共256个数字;
也有人认为1字节(byte)表示9位、7位等等,不过非常少见。还有一些用来表示更大数字的,会用到16位、32位、64位等等。
编码标准
ASCII(美国信息交换标准代码)是使用8位二进制(也就是1byte)数字来表示256个数字的编码方式,然后每个数字代表1个字符(例如26个大写字符+26个小写字母+10个数字+特殊字符等等,有兴趣可以百度下)。
但是这个标准只能对英语和部分西欧语言进行编码,世界上的语言多种多样,用到的字符数远远不止256个(例如中国常用汉字大约5000+)。为了解决这个问题,就有些人发明了Unicode(通用编码),Unicode提供的编码方案和ASCII表格类似,但是庞大很多,你可以用32位编码1个Unicode字符,它能装下所有的人类语言,还有表情符号等等。
但是32位是4bytes,这对于我们要编码的大部分类型的文本都是一种浪费。这个问题的解决方案就是把大部分常用字符用8位编码,如果需要编码更多的字符,就“逃”出去使用更大的数。于是我们又有了编码方式,就是一种压缩编码方式,UTF-8(Unicode Transformation Format 8 Bits)。
Python中字符串(string)和字节串(bytes)的转换:
字节串(bytes)→ 解码 .decode() → 字符串(string)
字符串(string)→ 编码 .encode() → 字节串(bytes)
字节串(bytes):由0,1组成的一组数,作为字节编码
字符串(string):我们平时看到的字符
对编码解码的自我理解:
就像通常说的密码本(摩斯码)一样,每个密码(字节串)代表了一个文字(字符串),将密文(字节串)解读成文字(字符串)需要解码(.decode()),将文字(字符串)进行加密成为密文需要编码(.encode())。
.strip()函数
描述
Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
**注意:**该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
语法
strip()方法语法:
str.strip([chars]);
参数
- chars – 移除字符串头尾指定的字符序列。
返回值
返回移除字符串头尾指定的字符生成的新字符串。
.encode()函数
描述
Python encode() 方法以 encoding 指定的编码格式编码字符串。errors参数可以指定不同的错误处理方案。
语法
encode()方法语法:
str.encode(encoding='UTF-8',errors='strict')
参数
- encoding – 要使用的编码,如"UTF-8"。
- errors – 设置不同错误的处理方案。
- 默认为 ‘strict’,意为编码错误引起一个UnicodeError。
- 其他可能得值有 ‘ignore’, ‘replace’, ‘xmlcharrefreplace’, ‘backslashreplace’ 以及通过 codecs.register_error() 注册的任何值。
返回值
该方法返回编码后的字符串。
.decode()函数
描述
Python decode() 方法以 encoding 指定的编码格式解码字符串。默认编码为字符串编码。
语法
decode()方法语法:
str.decode(encoding='UTF-8',errors='strict')
参数
- encoding – 要使用的编码,如"UTF-8"。
- errors – 设置不同错误的处理方案。
- 默认为 ‘strict’,意为编码错误引起一个UnicodeError。
- 其他可能得值有 ‘ignore’, ‘replace’, ‘xmlcharrefreplace’, ‘backslashreplace’ 以及通过 codecs.register_error() 注册的任何值。
返回值
该方法返回解码后的字符串。
版权声明:本文为CSDN博主「waitan2018」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/waitan2018/article/details/82716835