[python2.7 字符串编解码请教] -- 为啥报错

2019-03-11 10:10:51 +08:00
 chaleaochexist
'%s%s'%('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4',u'1')

Traceback (most recent call last):
  File "C:\Users\zhicfeng\Envs\vxmgr\lib\site-packages\IPython\core\interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-19-ca870cdd0e7e>", line 1, in <module>
    '%s%s'%('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4',u'1')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

'%s%s'%('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4','1')
Out[20]: '\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb41'
2271 次点击
所在节点    Python
19 条回复
geew
2019-03-11 10:15:23 +08:00
In [2]: '%s%s'%('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4','1')
Out[2]: '\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb41'

In [3]: '%s%s'%('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4',u'1'.encode('utf8'))
Out[3]: '\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb41'
geew
2019-03-11 10:16:03 +08:00
In [5]: '%s%s' % ('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4'.decode('utf8'),u'1')
Out[5]: u'\u541b\u4e0d\u89c1\u9ec4\u6cb3\u4e4b\u6c341'
est
2019-03-11 10:29:55 +08:00
点开帖子之前估计是 win。。果然是 win
Q2019cate
2019-03-11 10:33:01 +08:00
#coding=utf-8
jdhao
2019-03-11 10:37:38 +08:00
原始代码不贴一下,你说个🦆,云 debug ?另外,你做了什么?谷歌过相关问题吗?
lxy42
2019-03-11 10:40:49 +08:00
```
In [1]: '%s%s'%('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4',u'1')
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-1-ca870cdd0e7e> in <module>()
----> 1 '%s%s'%('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4',u'1')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

In [2]: '%s' % '\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4'
Out[2]: '\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4'

In [3]: print '%s' % '\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4'
君不见黄河之水

In [4]: '\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4'.decode('utf8')
Out[4]: u'\u541b\u4e0d\u89c1\u9ec4\u6cb3\u4e4b\u6c34'

In [5]: print'\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4'.decode('utf8')
君不见黄河之水

In [6]: print'\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4'.decode('gbk')
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-6-1ddec8fed84f> in <module>()
----> 1 print'\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4'.decode('gbk')

UnicodeDecodeError: 'gbk' codec can't decode byte 0xb4 in position 20: incomplete multibyte sequence

In [7]: '%s%s'%('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4','1')
Out[7]: '\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb41'

In [8]:

```

%后面的格式化参数一个是 bytes-string,一个是 unicode-string,最好统一一下。
chaleaochexist
2019-03-11 11:46:00 +08:00
@jdhao 不需要原始代码.直接可以重现.
我大概知道是什么问题. -- 就是 uncode 和 str 的编解码问题 但是
'%s%s'%('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4',u'1')
'%s%s'%('\xe5\x90\x9b\xe4\xb8\x8d\xe8\xa7\x81\xe9\xbb\x84\xe6\xb2\xb3\xe4\xb9\x8b\xe6\xb0\xb4','1')

一个成功一个不成功.请问如何谷歌.
chaleaochexist
2019-03-11 11:48:52 +08:00
@est 何出此言?
Kylin30
2019-03-11 11:53:46 +08:00
蛇吹灯之编码鬼洞
fy
2019-03-11 11:55:45 +08:00
不是 还有人在用 2.7 的吗
est
2019-03-11 12:00:26 +08:00
@chaleaochexist win 下编码坑很多。有的时候不是 py 的问题。是 cmd 的问题。
jdhao
2019-03-11 12:07:42 +08:00
@chaleaochexist 直接搜下面的错误即可,

> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
chaleaochexist
2019-03-11 12:30:55 +08:00
@jdhao 问题点不在这里.
ltux
2019-03-11 13:21:47 +08:00
只有你自己知道问题点在哪里,别人怎么会知道。花点时间搞清啥是 code point 啥是 encoding
,你的问题就解决了。Python 2.7 默认是 ascii 编码,看到 u'1' 知道应该用 utf-8,所以一个成功一个失败。

参考 https://docs.python.org/2.7/howto/unicode.html
也可参考 O'Reilly 出版社《 Learning Python 》,有一章专讲编码问题
XxxxD
2019-03-11 14:08:31 +08:00
python3 的 encode 是 string to byte, decode 是 byte to string, python2 的要反一下我记得,楼主好好找下关于 encode, decode 的说明? 另外也可以试试 errors = "ignore"
chaleaochexist
2019-03-11 14:18:05 +08:00
@ltux
`Python 2.7 默认是 ascii 编码,看到 u'1' 知道应该用 utf-8,所以一个成功一个失败。`
你好,请教, 谁看到 u'1' 知道应该用 utf-8? python 解释器吗? python 解释器在处理字符串存储的时候?还是在翻译'%s'%u'1'的时候.
确实不太清楚你说的是什么...

我对这里概念不是很清晰. 如果能解释一下 那多谢了.
no1xsyzy
2019-03-11 15:01:43 +08:00
首先可以肯定是发生了 '\xe5...'.decode('ascii')
结合 #2 可以很容易发现,旧式 '%' 格式化在存在 unicode 的时候把所有的都处理成 unicode。
而默认的 unicode(some_byte_string) 采用了 some_byte_string.decode('ascii')
同报错最小复现:unicode('\xe5')
Available at: <https://repl.it/repls/ImpressionableGraciousPorts>
www5070504
2019-03-11 15:12:35 +08:00
没人吐槽一下 gbk 编码么
chaleaochexist
2019-03-11 16:27:13 +08:00
@no1xsyzy 这就是我想要的答案.感谢感谢.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/543208

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX