如何将Python中的中文字符进行多种编码转换操作?

更新于
2026-08-20 09:43:06
2阅读来源:SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

一、为何中文字符编码转换总是让人头疼?

在日常开发中,你可能会遇到以下痛点:

  • ⛔️乱码——页面或日志里出现“��”或奇怪的字符。
  • 不确定文件到底是 UTF‑8、GBK 还是 GB2312手动猜测耗时又容易出错。
  • ⚖️Python 2 与 Python 3 的编码模型不统一导致同一段代码在两个版本上表现不同。话说回来,
  • 🔗URL 参数中文被转成 %E4%B8%AD%E5%9B%BD 这种“火星文”看不懂也难以恢复。

二、Python 中的编码转换主要流程

source → Unicode → dest

如何将Python中的中文字符进行多种编码转换操作?

把原始字节流解码为 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:

  • 源文件实际使用的编码与读取时指定的编码不一致。
  • Pyth​on 2 中忘记先将 str decode 成 Unicode。
  • Pyth​on 3 中误将已经是 bytes 的对象 decode,导致 “UnicodeDecodeError”。不过,

再看Q2。如何在 Python 2 和 Python 3 之间无痛迁移?

  • Pyth​on 2 保持所有外部 I/O 使用显式的 .decode/.encode,并在内部统一使用 Unicode。
  • Pyth​on 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 …” 怎么办,

    • Pyth​on 默认把非 ASCII 字符当作 ascii 编码处理。解决办法是在脚本开头声明文件编码或显式指定 target 编码:

    # -- coding: utf-8 -- # 文件头声明源码使用 UTF‑8

    text = "含有中文的字符串" print) # 明确使用 utf‑8 编码输出

    如何将Python中的中文字符进行多种编码转换操作?

    五、常用方法小结

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

    标签:乱码

    一、为何中文字符编码转换总是让人头疼?

    在日常开发中,你可能会遇到以下痛点:

    • ⛔️乱码——页面或日志里出现“��”或奇怪的字符。
    • 不确定文件到底是 UTF‑8、GBK 还是 GB2312手动猜测耗时又容易出错。
    • ⚖️Python 2 与 Python 3 的编码模型不统一导致同一段代码在两个版本上表现不同。话说回来,
    • 🔗URL 参数中文被转成 %E4%B8%AD%E5%9B%BD 这种“火星文”看不懂也难以恢复。

    二、Python 中的编码转换主要流程

    source → Unicode → dest

    如何将Python中的中文字符进行多种编码转换操作?

    把原始字节流解码为 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:

    • 源文件实际使用的编码与读取时指定的编码不一致。
    • Pyth​on 2 中忘记先将 str decode 成 Unicode。
    • Pyth​on 3 中误将已经是 bytes 的对象 decode,导致 “UnicodeDecodeError”。不过,

    再看Q2。如何在 Python 2 和 Python 3 之间无痛迁移?

    • Pyth​on 2 保持所有外部 I/O 使用显式的 .decode/.encode,并在内部统一使用 Unicode。
    • Pyth​on 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 …” 怎么办,

    • Pyth​on 默认把非 ASCII 字符当作 ascii 编码处理。解决办法是在脚本开头声明文件编码或显式指定 target 编码:

    # -- coding: utf-8 -- # 文件头声明源码使用 UTF‑8

    text = "含有中文的字符串" print) # 明确使用 utf‑8 编码输出

    如何将Python中的中文字符进行多种编码转换操作?

    五、常用方法小结

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

    标签:乱码