笨办法学python3 学习笔记 习题23

习题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)。

img

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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值