当前位置:
首页 > Python基础教程 >
-
Python3标准库:codecs字符串编码和解码(2)
(0, len(hex_version), chars_per_item)
)
encodings = ['utf-8','utf-16','utf-32']
for encoding in encodings:
filename = encoding + '.txt'
print('Writing to', filename)
with codecs.open(filename, mode='w', encoding=encoding) as f:
f.write('français')
# Determine the byte grouping to use for to_hex()
nbytes = {
'utf-8': 1,
'utf-16': 2,
'utf-32': 4,
}.get(encoding, 1)
# Show the raw bytes in the file
print('File contents:')
with open(filename, mode='rb') as f:
print(to_hex(f.read(), nbytes))
这个例子首先处理一个包含ç的unicode串,使用指定的编码将这个文本保存到一个文件。
用open()读数据很简单,但有一点要注意:必须提前知道编码才能正确的建立解码器。尽管有些数据格式(如XML)会在文件中指定编码,但是通常都要由应用来管理。codecs只是取一个编码参数,并假设这个编码是正确的。
- import binascii
- import codecs
- def to_hex(t, nbytes):
- """Format text t as a sequence of nbyte long values
- separated by spaces.
- """
- chars_per_item = nbytes * 2
- hex_version = binascii.hexlify(t)
- return b' '.join(
- hex_version[start:start + chars_per_item]
- for start in range(0, len(hex_version), chars_per_item)
- )
- encodings = ['utf-8','utf-16','utf-32']
- for encoding in encodings:
- filename = encoding + '.txt'
- print('Reading from', filename)
- with codecs.open(filename, mode='r', encoding=encoding) as f:
- print(repr(f.read()))
这个例子读取上一个程序创建的文件,并把得到的unicode对象的表示打印到控制台。
1.3 字节序
在不同的计算机系统之间传输数据时(可能直接复制一个文件,或者使用网络通信来完成传输),多字节编码(如UTF-16和UTF-32)会带来一个问题。不同系统中使用的高字节和低字节的顺序不同。数据的这个特性被称为字节序(endianness),这取决于硬件体系结构等因素,还取决于操作系统和应用开发人员做出的选择。通常没有办法提前知道给定的一组数据要使用哪一个字节序,所以多字节编码还包含一个字节序标志(Byte-Order Marker,BOM),这个标志出现在编码输出的前几个字节。例如,UTF-16定义0xFFFE和0xFEFF不是合法字符,可以用于指示字节序。codecs定义了UTF-16和UTF-32所用的字节序标志的相应常量。
- import codecs
- import binascii
- def to_hex(t, nbytes):
- """Format text t as a sequence of nbyte long values
- separated by spaces.
- """
- chars_per_item = nbytes * 2
- hex_version = binascii.hexlify(t)
- return b' '.join(
- hex_version[start:start + chars_per_item]
- for start in range(0, len(hex_version), chars_per_item)
- )
- BOM_TYPES = [
- 'BOM', 'BOM_BE', 'BOM_LE',
- 'BOM_UTF8',
- 'BOM_UTF16', 'BOM_UTF16_BE', 'BOM_UTF16_LE',
- 'BOM_UTF32', 'BOM_UTF32_BE', 'BOM_UTF32_LE',
- ]
- for name in BOM_TYPES:
- print('{:12} : {}'.format(
- name, to_hex(getattr(codecs, name), 2)))
取决于当前系统的原生字节序,BOM、BOM_UTF16和BOM_UTF32会自动设置为适当的大端(big-endian)或小端(little-endian)值。
可以由codecs中的解码器自动检测和处理字节序,也可以在编码时显式的指定字节序。
- import codecs
- import binascii
栏目列表
最新更新
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.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式