字符串和编码
1. 字符编码基础
1.1 编码的必要性
- 计算机只能处理数字,必须将文本转换为数字才能处理
- 最早的计算机使用8比特(bit)作为1字节(byte),单字节最大表示255
1.2 ASCII编码
- 美国标准,包含127个字符(英文字母、数字、符号)
- 例如:A=65(01000001),z=122
1.3 多语言编码问题
- 中文需要GB2312(至少2字节)
- 日文使用Shift_JIS,韩文使用Euc-kr
- 多语言混合时会出现乱码
1.4 Unicode解决方案
- 统一所有语言的编码标准
- 最常用的是UTF-16(2字节/字符,生僻字4字节)
- 现代操作系统和编程语言普遍支持
1.5 UTF-8编码
- Unicode的可变长编码实现
- 英文字母:1字节
- 汉字:通常3字节
- 生僻字符:4-6字节
- 兼容ASCII(ASCII是UTF-8的子集)
2. 编码工作方式
- 内存中:统一使用Unicode
- 存储/传输时:转换为UTF-8
- 网页通常使用UTF-8编码(
<meta charset="UTF-8">)
3. Python字符串处理
3.1 基本特性
- Python 3字符串默认使用Unicode编码
print('包含中文的str') # 支持多语言
3.2 字符编码转换
ord():获取字符的Unicode码点chr():将码点转换为字符
ord('A') # 65
ord('中') # 20013
chr(66) # 'B'
chr(25991) # '文'
3.3 十六进制表示
'\u4e2d\u6587' # '中文'
3.4 bytes类型
- 网络传输/磁盘存储需要转换为bytes
- 使用
b前缀表示
x = b'ABC' # bytes类型
3.5 编码转换方法
encode():str → bytesdecode():bytes → str
'ABC'.encode('ascii') # b'ABC'
'中文'.encode('utf-8') # b'\xe4\xb8\xad\xe6\x96\x87'
b'ABC'.decode('ascii') # 'ABC'
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') # '中文'
3.6 错误处理
# 忽略解码错误
b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore') # '中'
3.7 长度计算
len('ABC') # 3 (字符数)
len('中文') # 2
len('中文'.encode('utf-8')) # 6 (字节数)
3.8 源代码编码
- 包含中文的Python文件应保存为UTF-8
- 文件开头添加编码声明:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
4. 字符串格式化
4.1 %格式化(传统方式)
'Hello, %s' % 'world' # 'Hello, world'
'Hi, %s, you have $%d.' % ('Michael', 1000000)
'%2d-%02d' % (3, 1) # ' 3-01'
'%.2f' % 3.1415926 # '3.14'
'growth rate: %d %%' % 7 # 'growth rate: 7 %'
4.2 format()方法
'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
4.3 f-string(Python 3.6+推荐)
r = 2.5
s = 3.14 * r ** 2
f'The area of a circle with radius {r} is {s:.2f}'
# 'The area of a circle with radius 2.5 is 19.62'
5. 最佳实践
- 始终使用UTF-8编码处理文本
- 优先使用f-string进行字符串格式化
- 处理文件I/O时明确指定编码
- 在Python 3中避免使用str和bytes混用
6. 练习示例
# 计算成绩提升百分比
s1 = 72
s2 = 85
r = (s2 - s1) / s1 * 100
print(f'成绩提升了{r:.1f}%') # 成绩提升了18.1%
7. 总结
- Python 3字符串原生支持Unicode,完美处理多语言
- 内存使用Unicode,存储/传输使用UTF-8
- 字符串格式化推荐使用f-string(Python 3.6+)
- 始终明确编码转换,避免乱码问题
想要解锁更多 Python 实战黑科技?搜索「道满PythonAI」,海量免费教程随你练,边学边练进步更快! 下一篇想学 Python 什么内容?评论区告诉我!觉得有用就点赞 + 关注,持续更新干货~ 私信【111】进入技术交流群