求解如果 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'
找到方法了:
In [107]: original.encode().decode('unicode-escape').encode('latin1').decode('utf-8')
Out[107]: 'abc→'
1
Monad 2018-02-28 11:28:36 +08:00
exp = '"{}".decode("UTF-8")'.format(original)
what_i_want = eval(exp) =.= |
2
scriptB0y OP @Monad 不行吧。。。
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' |
3
Thanks 2018-02-28 11:37:47 +08:00
emmmm...
首先,\\ 双反代表一个不具备转移功能的 \ 其次,b"abc\xe2\x86\x92" 才能用 decode()处理编码,注意这个是 bytes,里面是单 \ 最后, Python3.6 下有: >>> b = b"abc\xe2\x86\x92" >>> b.decode() 'abc→' |
4
Thanks 2018-02-28 11:38:16 +08:00
转移 => 转义
|
5
scriptB0y OP @Thanks 你说的我都知道。我的问题是把 original = "abc\\xe2\\x86\\x92" 转换成 'abc→'
|
6
Monad 2018-02-28 12:15:12 +08:00 1
|
8
scriptB0y OP @Monad 顺着你的思路找了解决方法了!
In [107]: original.encode().decode('unicode-escape').encode('latin1').decode('utf-8') Out[107]: 'abc→' 太好玩了 |
9
Monad 2018-02-28 12:35:26 +08:00
|
10
scriptB0y OP @Monad decode('unicode-escape') 的结果是 latin-1 编码的,这是错误的,所以要 encode 回去然后使用正确的 utf-8 decode。
这里文档有说: https://docs.python.org/3/library/codecs.html#python-specific-encodings (搜索 unicode_escape ) |