首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

Python3 decode 问题

  •  
  •   scriptB0y · 113 天前 · 1335 次点击
    这是一个创建于 113 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求解如果 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'
    
    第 1 条附言  ·  113 天前
    问题是:

    将 "abc\\xe2\\x86\\x92" ( str) 转换成 'abc→' (str) 或 b'abc\xe2\x86\x92' ( bytes)
    第 2 条附言  ·  113 天前

    找到方法了:

    In [107]: original.encode().decode('unicode-escape').encode('latin1').decode('utf-8') 
    Out[107]: 'abc→' 
    
    13 回复  |  直到 2018-02-28 13:48:37 +08:00
        1
    Monad   113 天前
    exp = '"{}".decode("UTF-8")'.format(original)
    what_i_want = eval(exp)
    =.=
        2
    scriptB0y   113 天前
    @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   113 天前
    emmmm...

    首先,\\ 双反代表一个不具备转移功能的 \
    其次,b"abc\xe2\x86\x92" 才能用 decode()处理编码,注意这个是 bytes,里面是单 \
    最后,
    Python3.6 下有:
    >>> b = b"abc\xe2\x86\x92"
    >>> b.decode()
    'abc→'
        4
    Thanks   113 天前
    转移 => 转义
        5
    scriptB0y   113 天前
    @Thanks 你说的我都知道。我的问题是把 original = "abc\\xe2\\x86\\x92" 转换成 'abc→'
        6
    Monad   113 天前   ♥ 1
    @scriptB0y #2 这是 Python2 的方式
    original.decode('string_escape')
    这个应该是 2/3 都可以的 你试试
        7
    scriptB0y   113 天前
    @Monad str 没有 decode 方法啊。
        8
    scriptB0y   113 天前
    @Monad 顺着你的思路找了解决方法了!

    In [107]: original.encode().decode('unicode-escape').encode('latin1').decode('utf-8')
    Out[107]: 'abc→'

    太好玩了
        9
    Monad   113 天前
    @scriptB0y #8 刚刚傻了 shebang 里面写的 python3 但是一直用 python xx.py 执行的...
    想不起来为啥要 encode('latin-1')了 求告知
        10
    scriptB0y   113 天前   ♥ 1
    @Monad decode('unicode-escape') 的结果是 latin-1 编码的,这是错误的,所以要 encode 回去然后使用正确的 utf-8 decode。

    这里文档有说: https://docs.python.org/3/library/codecs.html#python-specific-encodings (搜索 unicode_escape )
        11
    Monad   113 天前 via iPhone
    @scriptB0y 哦哦 应该是 decode("unicode-escape")做了两个工作 一个是 escape 一个是 decode 由于不能支持两个 decode 参数 所以必须 encode 成 latin1 再 decode

    decode 如果加一个 kwargs escape=True 那么就可以直接按 utf8 decode 了
        12
    scriptB0y   113 天前
    @Monad 是的,我也是这么想的。
        13
    zzhirong   113 天前
    @scriptB0y
    @Monad
    python2 中可以,python3 中少了一个 'b'
    exp = 'b"{}".decode("UTF-8")'.format(original)
    what_i_want = eval(exp)
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   2614 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 16ms · UTC 10:08 · PVG 18:08 · LAX 03:08 · JFK 06:08
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1