当前位置:
首页 > Python基础教程 >
-
Python3标准库:codecs字符串编码和解码(7)
(256))
# Make a list of pairs of ordinal values for the lower
# and uppercase letters
pairs = list(zip(
[ord(c) for c in string.ascii_lowercase],
[ord(c) for c in string.ascii_uppercase],
))
# Modify the mapping to convert upper to lower and
# lower to upper.
decoding_map.update({
upper: lower
for (lower, upper)
in pairs
})
decoding_map.update({
lower: upper
for (lower, upper)
in pairs
})
# Create a separate encoding map.
encoding_map = codecs.make_encoding_map(decoding_map)
text = 'pi: \u03c0'
for error in ['ignore', 'replace', 'strict']:
try:
encoded = codecs.charmap_encode(
text, error, encoding_map)
except UnicodeEncodeError as err:
encoded = str(err)
print('{:7}: {}'.format(error, encoded))
由于π的Unicode码点不再编码映射中,所以采用strict错误处理模式时会产生一个异常。
定义了编码和解码映射之后,还需要建立一些额外的类,另外要注册编码。register()向注册表增加一个搜索函数,使得当用户希望使用这种编码时,codecs能够找到它。这个搜索函数必须有一个字符串参数,其中包含编码名,如果它知道这个编码则返回一个CodecInfo对象,否则返回None。
- import codecs
- def search1(encoding):
- print('search1: Searching for:', encoding)
- return None
- def search2(encoding):
- print('search2: Searching for:', encoding)
- return None
- codecs.register(search1)
- codecs.register(search2)
- utf8 = codecs.lookup('utf-8')
- print('UTF-8:', utf8)
- try:
- unknown = codecs.lookup('no-such-encoding')
- except LookupError as err:
- print('ERROR:', err)
可以注册多个搜索函数,每个搜索函数将依次调用,直到一个搜索函数返回一个CodecInfo,或者所有搜索函数都已经调用。codecs注册的内部搜索函数知道如何加装标准codecs,如encodings的UTF-8,所以这些编码名不会传递到定制搜索函数。
搜索函数返回的CodecInfo实例告诉codecs如何使用所支持的各种不同机制来完成编码和解码,包括:无状态编码、增量式编码和流编码。codecs包括一些基类来帮助建立字符映射编码。下面这个例子集成了所有内容,它会注册一个搜索函数,并返回为invertcaps codec配置的一个CodecInfo实例。
- import codecs
- import string
- # Map every character to itself
- decoding_map = codecs.make_identity_dict(range(256))
- # Make a list of pairs of ordinal values for the lower
- # and uppercase letters
- pairs = list(zip(
- [ord(c) for c in string.ascii_lowercase],
- [ord(c) for c in string.ascii_uppercase],
- ))
- # Modify the mapping to convert upper to lower and
- # lower to upper.
- decoding_map.update({
- upper: lower
- for (lower, upper)
- in pairs
- })
- decoding_map.update({
- lower: upper
- for (lower, upper)
- in pairs
- })
- # Create a separate encoding map.
- encoding_map = codecs.make_encoding_map(decoding_map)
- class InvertCapsCodec(codecs.Codec):
- "Stateless encoder/decoder"
- def encode(self, input, errors='strict'):
- return codecs.charmap_encode(input, errors, encoding_map)
- def decode(self, input, errors='strict'):
- return codecs.charmap_decode(input, errors, decoding_map)
- class InvertCapsIncrementalEncoder(codecs.IncrementalEncoder):
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式