【流畅的python》4.1 节学习笔记 --- 编码与解码】

前言

本文为《流畅的python》的4.1节的学习笔记。

代码展示

编码与解码


s = 'café'
print(len(s))
>>>
4

b = s.encode('utf8')
print(b)
>>>
b'caf\xc3\xa9'

print(len(b))
>>>
5

a = b.decode('utf8')
print(a)
>>>
café

说明:s为字符串,是用于人类识别的内容。编码(encode函数)的作用是把人类可识别的字符转换为机器可识别的字节序列。解码(decode函数)与编码是相反的过程,其作用是把机器可识别的字节序列转换为人类可识别的字符。从运行结果可以看出,编码内容的长度与解码内容的长度也是不一样的。

编码解码的错误处理


city = 'São Paulo'
city_u8 =city.encode('utf8')
print(city_u8)
>>>
b'S\xc3\xa3o Paulo'

city_u16 = city.encode('utf16')
print(city_u16)
>>>
b'\xff\xfeS\x00\xe3\x00o\x00 \x00P\x00a\x00u\x00l\x00o\x00'

city_cp437 = city.encode('cp437')
print(city_cp437)
>>>
Traceback (most recent call last):
  line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character '\xe3' in position 1: character maps to <undefined>

city_cp437 = city.encode('cp437', errors= 'ignore')
print(city_cp437)
>>>
b'So Paulo'

city_cp437 = city.encode('cp437', errors= 'replace')
print(city_cp437)
>>>
b'S?o Paulo'

说明:utf8 utf16 cp437是解编码器的不同类型,在进行编码时,把文本转换成字节序列时,如果目标编码中没有定义某个字符,那就会抛出UnicodeEncodeError 异常,如上第三个用例。除非把errors参数传给编码方法或函数,对错误进行特殊处理,使用’ignore’,当转换有异常时,将直接跳过此字符,导致信息的丢失,用户也不知道此情况。而使用’replace’,当转换有异常时,将文本使用’?'代替。可见’replace’的错误处理方法是比’ignore’更好的。


octets = b'Montr\xe9al'
ots_cp1252 = octets.decode('cp1252')
print(ots_cp1252)
>>>
Montréal

ots_iso = octets.decode('iso8859_7')
print(ots_iso)
>>>
Montrιal

ots_u8 = octets.decode('utf8', errors= 'replace')
print(ots_u8)
>>>
Montr�al

说明:在进行解码时,同样会发生字节序列和字符无对应定义的情况,此时可以通过errors参数对错误进行处理。

总结

  1. 编码解码的作用。
  2. 编码解码的错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值