Python中遇到令人困扰的编码问题该如何解决?

Py3.6

>>> r’\u4e2d’.encode(‘unicode_escape’)
b’\\u4e2d’
>>> b’\\u4e2d’.decode(‘unicode_escape’)
‘\u4e2d’
>>> b’\u005c\u0075\u0034\u0065\u0032\u0064’.decode(‘unicode_escape’)
‘\u4e2d’
>>> b’\u005c\u0075\u0034\u0065\u0032\u0064’.decode(‘unicode_escape’) == b’\\u4e2d’.decode(‘unicode_escape’)
True
>>> b’\u005c\u0075\u0034\u0065\u0032\u0064’ == b’\\u4e2d’
False


r’\u4e2d’ 的 unicode 编码应该是 b’\u005c\u0075\u0034\u0065\u0032\u0064’这个阿,为什么 encode(‘unicode_escape’)出来的是 b’\\u4e2d’这个?

而且 b’\\u4e2d’和 b’\u005c\u0075\u0034\u0065\u0032\u0064’ 都可以解码出来 r’\u4e2d’,这是为什么?
Python中遇到令人困扰的编码问题该如何解决?


2 回复

遇到编码问题确实头疼,但核心就两点:统一编码、正确处理转换。

首先,确保你的Python文件本身保存为UTF-8(现代IDE默认都是)。在文件开头加这行声明:

# -*- coding: utf-8 -*-

虽然Python3默认UTF-8,但加上更明确。

读写文件时,永远encoding参数指定编码:

with open('file.txt', 'r', encoding='utf-8') as f:
    content = f.read()
with open('file.txt', 'w', encoding='utf-8') as f:
    f.write(content)

处理网络数据或不确定来源的字符串时,先尝试解码:

# 假设收到gbk编码的字节流
byte_data = b'\xc4\xe3\xba\xc3'
try:
    text = byte_data.decode('gbk')
except UnicodeDecodeError:
    # 尝试其他编码或错误处理
    text = byte_data.decode('gbk', errors='ignore')  # 忽略错误部分

数据库连接、API调用等地方也都要检查编码设置。记住原则:内部统一用Unicode(Python3的str),只在输入输出时进行编解码。

总结就一句:读写数据时显式指定编码,内部处理用Unicode。


你比较一下这个
r’\u4e2d’.encode(‘raw_unicode_escape’)

然后再看看文档,搞清楚 unicode_escape 的行为是什么

回到顶部