V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chaleaochexist
V2EX  ›  Python

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

  •  
  •   chaleaochexist · 2019-03-11 10:10:51 +08:00 · 2067 次点击
    这是一个创建于 1844 天前的主题,其中的信息可能已经有所发展或是发生改变。
    '%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'
    
    第 1 条附言  ·  2019-03-11 11:47:59 +08:00
    好朋友们,我知道如何解决这个问题哈.

    但是想知道原理...给个链接和方向也可以.
    19 条回复    2019-03-11 16:27:13 +08:00
    geew
        1
    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
        2
    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
        3
    est  
       2019-03-11 10:29:55 +08:00
    点开帖子之前估计是 win。。果然是 win
    Q2019cate
        4
    Q2019cate  
       2019-03-11 10:33:01 +08:00
    #coding=utf-8
    jdhao
        5
    jdhao  
       2019-03-11 10:37:38 +08:00
    原始代码不贴一下,你说个🦆,云 debug ?另外,你做了什么?谷歌过相关问题吗?
    lxy42
        6
    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
        7
    chaleaochexist  
    OP
       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
        8
    chaleaochexist  
    OP
       2019-03-11 11:48:52 +08:00
    @est 何出此言?
    Kylin30
        9
    Kylin30  
       2019-03-11 11:53:46 +08:00
    蛇吹灯之编码鬼洞
    fy
        10
    fy  
       2019-03-11 11:55:45 +08:00
    不是 还有人在用 2.7 的吗
    est
        11
    est  
       2019-03-11 12:00:26 +08:00
    @chaleaochexist win 下编码坑很多。有的时候不是 py 的问题。是 cmd 的问题。
    jdhao
        12
    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
        13
    chaleaochexist  
    OP
       2019-03-11 12:30:55 +08:00
    @jdhao 问题点不在这里.
    ltux
        14
    ltux  
       2019-03-11 13:21:47 +08:00 via Android   ❤️ 1
    只有你自己知道问题点在哪里,别人怎么会知道。花点时间搞清啥是 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
        15
    XxxxD  
       2019-03-11 14:08:31 +08:00
    python3 的 encode 是 string to byte, decode 是 byte to string, python2 的要反一下我记得,楼主好好找下关于 encode, decode 的说明? 另外也可以试试 errors = "ignore"
    chaleaochexist
        16
    chaleaochexist  
    OP
       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
        17
    no1xsyzy  
       2019-03-11 15:01:43 +08:00   ❤️ 2
    首先可以肯定是发生了 '\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
        18
    www5070504  
       2019-03-11 15:12:35 +08:00
    没人吐槽一下 gbk 编码么
    chaleaochexist
        19
    chaleaochexist  
    OP
       2019-03-11 16:27:13 +08:00
    @no1xsyzy 这就是我想要的答案.感谢感谢.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2852 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:21 · PVG 23:21 · LAX 08:21 · JFK 11:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.