
求解如果 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 年 2 月 28 日 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 年 2 月 28 日 emmmm... 首先,\\ 双反代表一个不具备转移功能的 \ 其次,b"abc\xe2\x86\x92" 才能用 decode()处理编码,注意这个是 bytes,里面是单 \ 最后, Python3.6 下有: >>> b = b"abc\xe2\x86\x92" >>> b.decode() 'abc→' |
4 Thanks 2018 年 2 月 28 日 转移 => 转义 |
6 Monad 2018 年 2 月 28 日 |
8 scriptB0y OP @Monad 顺着你的思路找了解决方法了! In [107]: original.encode().decode('unicode-escape').encode('latin1').decode('utf-8') Out[107]: 'abc→' 太好玩了 |
9 Monad 2018 年 2 月 28 日 |
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 ) |