1
lhx2008 2018-03-20 12:40:04 +08:00 via Android
直接 decode 不行吗
|
2
jasonyang9 2018-03-20 12:42:41 +08:00
湖州新
|
4
lastpass 2018-03-20 12:43:58 +08:00 via Android
"湖州新�" ??直接转就好
|
5
Mavious OP @lhx2008
不行,直接 decode 会报 AttributeError: 'str' object has no attribute 'decode' 因为 str 是不能解码的。这是 py3 的特性,py2 就没这个错了。(这就是我为此浪费了几个小时的弯路) |
6
lhx2008 2018-03-20 12:46:26 +08:00 via Android
cmd 里面乱码的话,是什么环境?
|
7
signxer 2018-03-20 12:48:42 +08:00 1
str(b'\xe6\xb9\x96\xe5\xb7\x9e\xe6\x96\xb0','utf-8'),三个组成一个汉字,所以你这只有 11 个少一个,我只取了 9 个
|
8
am241 2018-03-20 12:48:45 +08:00 1
b'\xe6\xb9\x96\xe5\xb7\x9e\xe6\x96\xb0\xe5\x9f'.decode('utf-8', errors='ignore')
|
9
Mavious OP @am241 @signxer
你好,方法很暴力很有效。 但是我看到文档里提到,b 后面必须跟随单双引号 “ Python 对 bytes 类型的数据用带 b 前缀的单引号或双引号表示” https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000 实际上,\xe6\xb9\x96\xe5\xb7 ……是一串可变数据,我给它命名为 productName 方便引用。但是 b 后面一跟随变量就报错。 print (b(productName).decode('utf-8', errors='ignore')) 报 NameError: name 'b' is not defined 如文档所说,单双引号里面必须存放写死的了数据,不能写变量。 如果 b 前缀只认可单双引号的话,变量这种东西该如何解呢? 谢谢。我是萌新,不好意思。 |
10
binux 2018-03-20 13:52:06 +08:00
'\xe6\xb9\x96\xe5\xb7\x9e\xe6\x96\xb0\xe5\x9f'.encode('latin_1').decode('utf8', 'ignore')
|
11
am241 2018-03-20 13:53:14 +08:00 2
@Mavious b'...'表示后面是 bytes 类型的数据,b'\x00'和 bytes([0])等价
b(productName) 函数调用或者创建实例 可以这样: # st = r'\xe6\xb9\x96\xe5\xb7\x9e\xe6\x96\xb0\xe5\x9f' bytes([int(i, 16) if i else None for i in st.split(r'\x')][1:]).decode('utf-8', errors='ignore') 或者: # st = r'\xe6\xb9\x96\xe5\xb7\x9e\xe6\x96\xb0\xe5\x9f' eval("b'"+(st)+"'").decode('utf-8', errors='ignore') |
12
SuT2i 2018-03-20 14:09:06 +08:00
想知道你爬下来是句字符串吗? 不一般都是 bytes 吗
|
13
Mavious OP |
14
ArianX 2018-03-20 15:15:05 +08:00 via Android
bytes.fromhex(str).decode('utf-8', errors='ignore'),这样可以吧
|
15
ArianX 2018-03-20 15:16:49 +08:00 via Android 1
额,应该是这样,bytes.fromhex(str.replace('\x','')).decode('utf-8', errors='ignore')
|
16
conn4575 2018-03-20 15:21:56 +08:00 via Android 1
了解一下内置的 struct 库
|
17
ae86 2018-03-20 17:05:32 +08:00 1
|
18
ae86 2018-03-20 17:09:40 +08:00 1
>>> s=r'\xe6\xb9\x96\xe5\xb7\x9e\xe6\x96\xb0\xe5\x9f\x8e\xe5\xbb\xba'
>>> eval('b"'+s+'"').decode('utf-8') '湖州新城建' 狐吧吧友雷吼啊,网上找的方法,我也不太会 py,不知道这样行不行。 |
19
chenstack 2018-03-20 17:48:46 +08:00 1
python3 的 str 类型内部存的是 unicode, str.encode 默认编码是 utf-8,'\xe6\xb9\x96'.encode()结果并不是 b'\xe6\xb9\x96'
说一下结论,个人认为比较好的方式,使用 latin-1 或 charmap 编码器编码到相同字节的 bytes: text = '\xe6\xb9\x96\xe5\xb7\x9e\xe6\x96\xb0\xe5\x9f\x8e\xe5\xbb\xba' print(text.encode('latin-1').decode('utf-8')) 或者手动映射: print(bytes(map(ord, text)).decode('utf-8')) |