Python3 decode 问题如何解决?

求解如果 str 混入了 bytes,但是被按照字面意思解释了,怎么 decode 回去。

In [80]: original = "abc\\xe2\\x86\\x92"

In [81]: b’\xe2\x86\x92’.decode() Out[81]: ‘→’

In [82]: what_i_want = “abc→”

In [83]: what_i_want.encode() Out[83]: b’abc\xe2\x86\x92’


Python3 decode 问题如何解决?

14 回复

exp = ‘"{}".decode(“UTF-8”)’.format(original)
what_i_want = eval(exp)
=.=


遇到Python3的decode问题,通常是因为字节串解码时使用了错误的编码方式。最常见的错误是UnicodeDecodeError: 'utf-8' codec can't decode byte...

核心解决方案:

  1. 明确数据源编码:确定你的字节数据原本是用什么编码的(如GBK、GB2312、ISO-8859-1等)。
  2. 使用正确编码解码:用对应的编码进行decode()
  3. 处理无法解码的情况:使用errors参数处理异常字符。

代码示例:

# 假设你有一个可能是GBK编码的字节串
byte_data = b'\xc4\xe3\xba\xc3'  # "你好"的GBK编码

# 1. 明确编码后直接解码
try:
    text = byte_data.decode('gbk')
    print(f"直接解码: {text}")
except UnicodeDecodeError:
    pass

# 2. 如果编码不确定,可以尝试常见编码
encodings = ['utf-8', 'gbk', 'gb2312', 'latin-1', 'iso-8859-1']
for enc in encodings:
    try:
        text = byte_data.decode(enc)
        print(f"使用{enc}解码成功: {text}")
        break
    except UnicodeDecodeError:
        continue

# 3. 忽略或替换无法解码的字符
text_ignore = byte_data.decode('utf-8', errors='ignore')  # 忽略错误
text_replace = byte_data.decode('utf-8', errors='replace')  # 替换为�符号

如果你的情况是:

  • 从文件读取:在open()时指定正确的encoding参数
  • 网络请求:检查响应头中的charset信息
  • 数据库数据:确认数据库连接编码设置

一句话建议: 确定数据源的原始编码是关键。

不行吧。。。

In [87]: eval( ‘"{}".decode(“UTF-8”)’.format(original) )
-------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-87-9a50a9092a0f> in <module>()
----> 1 eval( ‘"{}".decode(“UTF-8”)’.format(original) )

<string> in <module>()

AttributeError: ‘str’ object has no attribute ‘decode’

emmmm…

首先,\ 双反代表一个不具备转移功能的 <br>其次,b"abc\xe2\x86\x92" 才能用 decode()处理编码,注意这个是 bytes,里面是单 <br>最后,
Python3.6 下有:
>>> b = b"abc\xe2\x86\x92"
>>> b.decode()
‘abc→’

转移 => 转义

你说的我都知道。我的问题是把 original = “abc\xe2\x86\x92” 转换成 ‘abc→’

#2 这是 Python2 的方式
original.decode(‘string_escape’)
这个应该是 2/3 都可以的 你试试

str 没有 decode 方法啊。

顺着你的思路找了解决方法了!

In [107]: original.encode().decode(‘unicode-escape’).encode(‘latin1’).decode(‘utf-8’)
Out[107]: 'abc→’

太好玩了

#8 刚刚傻了 shebang 里面写的 python3 但是一直用 python xx.py 执行的…
想不起来为啥要 encode(‘latin-1’)了 求告知

decode(‘unicode-escape’) 的结果是 latin-1 编码的,这是错误的,所以要 encode 回去然后使用正确的 utf-8 decode。

这里文档有说: https://docs.python.org/3/library/codecs.html#python-specific-encodings (搜索 unicode_escape )

哦哦 应该是 decode(“unicode-escape”)做了两个工作 一个是 escape 一个是 decode 由于不能支持两个 decode 参数 所以必须 encode 成 latin1 再 decode

decode 如果加一个 kwargs escape=True 那么就可以直接按 utf8 decode 了

是的,我也是这么想的。



python2 中可以,python3 中少了一个 'b’
exp = ‘b"{}".decode(“UTF-8”)’.format(original)
what_i_want = eval(exp)

回到顶部