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
berry10086
V2EX  ›  Python

请教 python 字符串编码问题

  •  
  •   berry10086 · 2014-08-22 11:32:32 +08:00 · 4686 次点击
    这是一个创建于 3748 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ssid = u'\\xE4\\xB8\\x8D\\xE6\\x98\\xAF\\xE4\\xBD\\xA0\\xE7\\x9A\\x84\\xE7\\xBD\\x91\\xE4\\xBD\\xA0\\xE8\\xBF\\x9E\\xE4\\xB8\\xAA\\xE5\\x95\\xA5\\xE5\\x98\\x9E'

    多了一个\ 不能endoce('utf-8')
    请问怎样显示为中文?
    30 条回复    2014-08-23 09:30:02 +08:00
    manfay
        1
    manfay  
       2014-08-22 12:04:01 +08:00
    好有趣,真的不容易转,因为 '\' 和 '\x' 都是转义符。

    等高手解答……
    wangyongbo
        2
    wangyongbo  
       2014-08-22 12:09:52 +08:00
    print ssid
    重新复制一遍
    binux
        3
    binux  
       2014-08-22 12:10:11 +08:00
    这个字符串的含义就是 \xE4\xB8\x8D\xE6\x98\xAF\xE4\xBD\xA0\xE7\x9A\x84\xE7\xBD\x91\xE4\xBD\xA0\xE8\xBF\x9E\xE4\xB8\xAA\xE5\x95\xA5\xE5\x98\x9E

    有全是 ascii 字符,有什么不能转的?
    manfay
        4
    manfay  
       2014-08-22 12:17:30 +08:00
    @binux 我开始也这么以为,后来发现这个含义是 '\\' + 'xE4',硬是不能在程序内改成 '\xE4'
    wangyongbo
        5
    wangyongbo  
       2014-08-22 12:18:19 +08:00
    import binascii

    "".join(binascii.a2b_hex(x) for x in ssid.lstrip("\\x").split("\\x"))
    berry10086
        6
    berry10086  
    OP
       2014-08-22 12:19:37 +08:00 via Android
    @wangyongbo 不行,print之后是\xe4
    ehs2013
        7
    ehs2013  
       2014-08-22 12:20:34 +08:00
    >>> exec('ssid2="'+ssid+'"')
    >>> ssid2
    '\xe4\xb8\x8d\xe6\x98\xaf\xe4\xbd\xa0\xe7\x9a\x84\xe7\xbd\x91\xe4\xbd\xa0\xe8\xbf\x9e\xe4\xb8\xaa\xe5\x95\xa5\xe5\x98\x9e'
    >>> print ssid2
    不是你的网你连个啥嘞

    很 ugly 的做法,不过能用
    wangyongbo
        8
    wangyongbo  
       2014-08-22 12:21:09 +08:00
    @berry10086
    >>> s
    u'\\xE4\\xB8\\x8D\\xE6\\x98\\xAF\\xE4\\xBD\\xA0\\xE7\\x9A\\x84\\xE7\\xBD\\x91\\xE4\\xBD\\xA0\\xE8\\xBF\\x9E\\xE4\\xB8\\xAA\\xE5\\x95\\xA5\\xE5\\x98\\x9E'
    >>> print "".join(binascii.a2b_hex(x) for x in s.lstrip("\\x").split("\\x"))
    不是你的网你连个啥嘞
    >>>
    berry10086
        9
    berry10086  
    OP
       2014-08-22 12:22:04 +08:00 via Android
    @wangyongbo 谢谢😜
    berry10086
        10
    berry10086  
    OP
       2014-08-22 12:22:17 +08:00 via Android
    @ehs2013 谢谢😊
    binux
        11
    binux  
       2014-08-22 12:30:42 +08:00   ❤️ 2
    eval("'%s'" % ssid)


    PS:
    你肯定搞错什么了,你给的字符串的字面意就是
    \xE4\xB8\x8D\xE6\x98\xAF\xE4\xBD\xA0\xE7\x9A\x84\xE7\xBD\x91\xE4\xBD\xA0\xE8\xBF\x9E\xE4\xB8\xAA\xE5\x95\xA5\xE5\x98\x9E

    它表达的就是
    \xE4\xB8\x8D\xE6\x98\xAF\xE4\xBD\xA0\xE7\x9A\x84\xE7\xBD\x91\xE4\xBD\xA0\xE8\xBF\x9E\xE4\xB8\xAA\xE5\x95\xA5\xE5\x98\x9E

    这样一个纯ascii串
    skybr
        12
    skybr  
       2014-08-22 12:32:33 +08:00   ❤️ 5
    >>> ssid = u'\\xE4\\xB8\\x8D\\xE6\\x98\\xAF\\xE4\\xBD\\xA0\\xE7\\x9A\\x84\\xE7\\xBD\\x91\\xE4\\xBD\\xA0\\xE8\\xBF\\x9E\\xE4\\xB8\\xAA\\xE5\\x95\\xA5\\xE5\\x98\\x9E'
    >>> print s.decode('string-escape')
    不是你的网你连个啥嘞
    dbow
        13
    dbow  
       2014-08-22 12:33:06 +08:00   ❤️ 3
    @wangyongbo
    @ehs2013
    更加简洁高效的: print ssid.replace("\\x", "").decode("hex")
    dbow
        14
    dbow  
       2014-08-22 12:39:33 +08:00
    @skybr 赞string-escape.
    iptux
        15
    iptux  
       2014-08-22 12:40:32 +08:00
    "不是你的网你连个啥嘞"
    est
        16
    est  
       2014-08-22 12:42:14 +08:00
    >>> ssid = u'\\xE4\\xB8\\x8D\\xE6\\x98\\xAF\\xE4\\xBD\\xA0\\xE7\\x9A\\x84\\xE7\\xBD\\x91\\xE4\\xBD\\xA0\\xE8\\xBF\\x9E\\xE4\\xB8\\xAA\\xE5\\x95\\xA5\\xE5\\x98\\x9E'
    >>> print ssid.decode('string_escape')
    不是你的网你连个啥嘞
    est
        17
    est  
       2014-08-22 12:42:44 +08:00
    比 @skybr 慢了。
    hahastudio
        18
    hahastudio  
       2014-08-22 12:44:02 +08:00
    来一个好玩的
    >>> print eval('"%s"' % ssid)
    不是你的网你连个啥嘞
    hahastudio
        19
    hahastudio  
       2014-08-22 12:45:11 +08:00
    比 @binux 慢了。。。好久= =
    hahastudio
        20
    hahastudio  
       2014-08-22 12:46:58 +08:00   ❤️ 1
    突然想起来
    There should be one-- and preferably only one --obvious way to do it.
    然后觉得满脸黑线= =
    clino
        21
    clino  
       2014-08-22 12:47:21 +08:00
    感情是用python写wifi破解滴工具?
    berry10086
        22
    berry10086  
    OP
       2014-08-22 12:55:17 +08:00 via Android
    @clino 不是,是写一个管理wifi连接的web页面,搜到中文的ssid没法显示
    berry10086
        23
    berry10086  
    OP
       2014-08-22 12:55:34 +08:00 via Android
    @skybr 好方法,谢谢
    walleL
        24
    walleL  
       2014-08-22 15:38:06 +08:00
    >>> ssid = u'\\xE4\\xB8\\x8D\\xE6\\x98\\xAF\\xE4\\xBD\\xA0\\xE7\\x9A\\x84\\xE7\\xBD\\x91\\xE4\\xBD\\xA0\\xE8\\xBF\\x9E\\xE4\\xB8\\xAA\\xE5\\x95\\xA5\\xE5\\x98\\x9E'
    >>> print binascii.a2b_hex(ssid.replace('\\x', ''))
    不是你的网你连个啥嘞

    @wangyongbo 看了你的解法,然后去翻了一下文档,发现直接这样就可以。。。
    zonyitoo
        25
    zonyitoo  
       2014-08-22 17:23:10 +08:00
    ssid.decode('unicode_escape')
    这样可以否?
    berry10086
        26
    berry10086  
    OP
       2014-08-22 18:42:06 +08:00 via Android
    @zonyitoo 试过了,不行
    lll9p
        27
    lll9p  
       2014-08-22 19:01:12 +08:00
    Python2字符编码确实麻烦一点
    ehs2013
        29
    ehs2013  
       2014-08-22 21:22:45 +08:00
    @est 原来还有 string_escape 这说,学习了
    zonyitoo
        30
    zonyitoo  
       2014-08-23 09:30:02 +08:00
    @berry10086 ssid.decode('string_escape') 这样总行了吧,Python 2.7.5 亲测可用啊!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5242 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:55 · PVG 11:55 · LAX 19:55 · JFK 22:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.