如何将Python中的中文字符进行多种编码转换操作?
- 内容介绍
- 文章标签
- 相关推荐
一、为何中文字符编码转换总是让人头疼?
在日常开发中,你可能会遇到以下痛点:
- ⛔️乱码——页面或日志里出现“��”或奇怪的字符。
- ❓不确定文件到底是 UTF‑8、GBK 还是 GB2312手动猜测耗时又容易出错。
- ⚖️Python 2 与 Python 3 的编码模型不统一导致同一段代码在两个版本上表现不同。话说回来,
- 🔗URL 参数中文被转成 %E4%B8%AD%E5%9B%BD 这种“火星文”看不懂也难以恢复。
二、Python 中的编码转换主要流程
source → Unicode → dest
把原始字节流解码为 Unicode 对象,再根据目标编码重新编码为字节流。这个两段式过程是所有字符转换的根本。
1. encode 与 decode 基础用法
# 将字符串转为 UTF‑8 字节序列
text = "中文编码转换"
encoded_utf8 = text.encode # bytes
# 再把 UTF‑8 字节恢复为原始字符串
decoded_text = encoded_utf8.decode
print # 中文编码转换
优点:一次性处理整段文字,支持多种常见编码。适用于字符处理、密码学、日志写入等场景。话说回来,
2. Python 2 与 Python 3 的差异
-
Python 2:
str是字节序列。unicode才是文本。必须先把str转为unicode再 encode 到目标格式。 -
Python 3:
str本身就是 Unicode,直接调用.encode即可得到目标字节序列;bytes才是字节序列。
# Python 2 示例
s = u"这是一个中文字符串"
gbk_bytes = s.encode
# Python 3 示例
s = "这是一个中文字符串"
gbk_bytes = s.encode
三、实战:常见编码转换案例
a) UTF‑8 ↔ GBK 相互转换
# UTF‑8 → GBK
utf8_str = "这是一个中文字符串"
gbk_bytes = utf8_str.encode
print
# GBK → UTF‑8
utf8_str_again = gbk_bytes.decode
print
b) Unicode Escape 编码
# 将中文转成 \uXXXX 形式的 unicode‑escape 编码
chinese = "中文"
escaped = chinese.encode
print # b'\\u4e2d\\u6587'
# 恢复原始字符
original = escaped.decode
print # 中文
b) URL 编码与解码
# 将中文参数转成 URL 安全的 %XX 形式
import urllib.parse
param = "中国"
encoded_param = urllib.parse.quote
print # %E4%B9%9D%E5%9B%BD
# 解码回原始中文
decoded_param = urllib.parse.unquote
print # 中国
C) 自动检测文件编码——chardet 库实战
def detectfileencoding:
with open as f:
raw_data = f.read
result = chardet.detect
return result
encoding = detectfileencoding
print
检测到后就可以使用对应的 encoding 打开文件:
四、常见问题 & 疑难排查
Q1这方面,为什么出现乱码?
A:
-
源文件实际使用的编码与读取时指定的编码不一致。
-
Python 2 中忘记先将
str decode 成 Unicode。
-
Python 3 中误将已经是 bytes 的对象
decode,导致 “UnicodeDecodeError”。不过,
再看Q2。如何在 Python 2 和 Python 3 之间无痛迁移?
-
Python 2 保持所有外部 I/O 使用显式的
.decode/.encode,并在内部统一使用 Unicode。
-
Python 3 则直接使用字符串
),只在读写二进制流时使用 .encode/.decode
Simplify: 在代码最上层加入兼容层
python
import sys
if sys.version_info == 2:
text_type = unicode
binary_type = str
从else来看。text_type = str
binary_type = bytes
接下来统一使用 `text_type`/`binary_type` 做类型判断。
\end{itemize}
从Q3来看,遇到 “UnicodeEncodeError: 'ascii' codec can't encode character …” 怎么办,
-
Python 默认把非 ASCII 字符当作 ascii 编码处理。解决办法是在脚本开头声明文件编码或显式指定 target 编码:
# -- coding: utf-8 -- # 文件头声明源码使用 UTF‑8
text = "含有中文的字符串"
print) # 明确使用 utf‑8 编码输出

五、常用方法小结
-
统一使用 Unicode在业务逻辑层始终保持字符串为 Unicode,只在 I/O 边界进行 encode/deocode。
-
显式指定编码打开文件、网络请求或数据库连接时务必提供
encoding= 参数,避免依赖程序默认。
-
利用 chardet 自动检测对历史数据或第三方文件进行批量处理前,用
chardet.detect 确认实际编码。
-
异常捕获
try/except UnicodeDecodeError 与 UnicodeEncodeError 能帮助快速定位错误位置。
-
测试覆盖编写单元测试覆盖不同来源的文本读取/写入方法,确保迁移过程不产生新乱码。
\end ul>
一、为何中文字符编码转换总是让人头疼?
在日常开发中,你可能会遇到以下痛点:
- ⛔️乱码——页面或日志里出现“��”或奇怪的字符。
- ❓不确定文件到底是 UTF‑8、GBK 还是 GB2312手动猜测耗时又容易出错。
- ⚖️Python 2 与 Python 3 的编码模型不统一导致同一段代码在两个版本上表现不同。话说回来,
- 🔗URL 参数中文被转成 %E4%B8%AD%E5%9B%BD 这种“火星文”看不懂也难以恢复。
二、Python 中的编码转换主要流程
source → Unicode → dest
把原始字节流解码为 Unicode 对象,再根据目标编码重新编码为字节流。这个两段式过程是所有字符转换的根本。
1. encode 与 decode 基础用法
# 将字符串转为 UTF‑8 字节序列
text = "中文编码转换"
encoded_utf8 = text.encode # bytes
# 再把 UTF‑8 字节恢复为原始字符串
decoded_text = encoded_utf8.decode
print # 中文编码转换
优点:一次性处理整段文字,支持多种常见编码。适用于字符处理、密码学、日志写入等场景。话说回来,
2. Python 2 与 Python 3 的差异
-
Python 2:
str是字节序列。unicode才是文本。必须先把str转为unicode再 encode 到目标格式。 -
Python 3:
str本身就是 Unicode,直接调用.encode即可得到目标字节序列;bytes才是字节序列。
# Python 2 示例
s = u"这是一个中文字符串"
gbk_bytes = s.encode
# Python 3 示例
s = "这是一个中文字符串"
gbk_bytes = s.encode
三、实战:常见编码转换案例
a) UTF‑8 ↔ GBK 相互转换
# UTF‑8 → GBK
utf8_str = "这是一个中文字符串"
gbk_bytes = utf8_str.encode
print
# GBK → UTF‑8
utf8_str_again = gbk_bytes.decode
print
b) Unicode Escape 编码
# 将中文转成 \uXXXX 形式的 unicode‑escape 编码
chinese = "中文"
escaped = chinese.encode
print # b'\\u4e2d\\u6587'
# 恢复原始字符
original = escaped.decode
print # 中文
b) URL 编码与解码
# 将中文参数转成 URL 安全的 %XX 形式
import urllib.parse
param = "中国"
encoded_param = urllib.parse.quote
print # %E4%B9%9D%E5%9B%BD
# 解码回原始中文
decoded_param = urllib.parse.unquote
print # 中国
C) 自动检测文件编码——chardet 库实战
def detectfileencoding:
with open as f:
raw_data = f.read
result = chardet.detect
return result
encoding = detectfileencoding
print
检测到后就可以使用对应的 encoding 打开文件:
四、常见问题 & 疑难排查
Q1这方面,为什么出现乱码?
A:
-
源文件实际使用的编码与读取时指定的编码不一致。
-
Python 2 中忘记先将
str decode 成 Unicode。
-
Python 3 中误将已经是 bytes 的对象
decode,导致 “UnicodeDecodeError”。不过,
再看Q2。如何在 Python 2 和 Python 3 之间无痛迁移?
-
Python 2 保持所有外部 I/O 使用显式的
.decode/.encode,并在内部统一使用 Unicode。
-
Python 3 则直接使用字符串
),只在读写二进制流时使用 .encode/.decode
Simplify: 在代码最上层加入兼容层
python
import sys
if sys.version_info == 2:
text_type = unicode
binary_type = str
从else来看。text_type = str
binary_type = bytes
接下来统一使用 `text_type`/`binary_type` 做类型判断。
\end{itemize}
从Q3来看,遇到 “UnicodeEncodeError: 'ascii' codec can't encode character …” 怎么办,
-
Python 默认把非 ASCII 字符当作 ascii 编码处理。解决办法是在脚本开头声明文件编码或显式指定 target 编码:
# -- coding: utf-8 -- # 文件头声明源码使用 UTF‑8
text = "含有中文的字符串"
print) # 明确使用 utf‑8 编码输出

五、常用方法小结
-
统一使用 Unicode在业务逻辑层始终保持字符串为 Unicode,只在 I/O 边界进行 encode/deocode。
-
显式指定编码打开文件、网络请求或数据库连接时务必提供
encoding= 参数,避免依赖程序默认。
-
利用 chardet 自动检测对历史数据或第三方文件进行批量处理前,用
chardet.detect 确认实际编码。
-
异常捕获
try/except UnicodeDecodeError 与 UnicodeEncodeError 能帮助快速定位错误位置。
-
测试覆盖编写单元测试覆盖不同来源的文本读取/写入方法,确保迁移过程不产生新乱码。
\end ul>

