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
1OF7G
V2EX  ›  Python

请教一个编码问题,将 r'\u60a8' 本身带反斜杠的 string"解码"为汉字?

  •  1
     
  •   1OF7G ·
    zliy · 2017-04-17 09:27:56 +08:00 · 6061 次点击
    这是一个创建于 2777 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这么一个字符串: \u60a8 ,包含 反斜杠 \、 u 、 6 、 0 、 a 、 8 ,共 6 个字符,如何将它转化为对应的汉字“您”?

    >>> r'\u60a8'
    '\\u60a8'
    
    >>> print(r'\u60a8')
    \u60a8
    
    区别于一般情况:
    >>> print('\u60a8')
    您
    
    我想要的是:
    >>> print( magic(r'\u60a8'))
    您
    
    

    搜了半天,讲得都是 byte 和 string 的转化,这个 string 到 string 的也不知道怎么描述了。其实不算编码问题,只是靠的比较近

    望 v 友赐教!

    第 1 条附言  ·  2017-04-17 10:35:59 +08:00

    忘了说了是Python3,问题已经解决, 感谢2楼和3楼给出的2种解决方法:

    1,用正则匹配出16进制字符然后:
    >>> chr(0x60a8)
    '您'
    
    2,
    >>> eval('"' +  r'\u60a8' + '"')
    '您'
    
    
    第 2 条附言  ·  2017-04-17 14:31:42 +08:00
    画了个图,蓝色的方框是 Python3 表达式,大方框内表示等价的同一对象
    这个问题最佳方法应该是:
    >>> r'\u60a8'.encode('utf-8').decode('unicode_escape')
    '您'

    根据图片就很容易理解了
    20 条回复    2018-09-13 11:33:01 +08:00
    xmh51
        1
    xmh51  
       2017-04-17 09:33:22 +08:00
    AlphaTr
        2
    AlphaTr  
       2017-04-17 09:35:39 +08:00   ❤️ 3
    不懂 python ,说下其他语言的处理方式:正则匹配 `\u[a-f0-9]{4}` 然后取出对应的 16 进制字符串,转换为相应的字符编码,再求出对应字符,最后替换原字符~
    ehs2013
        3
    ehs2013  
       2017-04-17 09:39:37 +08:00   ❤️ 1
    危险但是有效的手段:
    input = r'\u60a8'
    output = eval('"' + input + '"')
    print(output)
    libook
        4
    libook  
       2017-04-17 09:42:52 +08:00 via Android
    这个是 js 里的转义字符,在 js 的输出上和汉字是等价的。
    不清楚 python 的编码方式, JS 的 unicode 编码方式和 unicode 官方编码还是有点区别的,需要用公式换算,建议看看 js 的 unicode 编码标准
    est
        5
    est  
       2017-04-17 09:46:51 +08:00
    print '\u60a8'.decode('raw_unicode_escape')
    est
        6
    est  
       2017-04-17 09:47:12 +08:00   ❤️ 1
    print '\u60a8'.decode('unicode_escape')
    onlyice
        7
    onlyice  
       2017-04-17 10:02:29 +08:00
    r'\u60a8'.decode('unicode_escape')

    est 正解,但是打少了 r 前缀
    1OF7G
        8
    1OF7G  
    OP
       2017-04-17 10:26:59 +08:00
    @AlphaTr #2
    @ehs2013 #3
    多谢,已经解决!
    enenaaa
        9
    enenaaa  
       2017-04-17 11:26:09 +08:00   ❤️ 1
    @onlyice python 3 应该是 b 前缀, b'\u60a8'.decode('unicode_escape')
    这个才是比较好的解决办法
    onlyice
        10
    onlyice  
       2017-04-17 11:31:29 +08:00
    @enenaaa 嗯,但是似乎楼主采用了 #2 #3 的不好的实践。。
    dant
        11
    dant  
       2017-04-17 11:39:31 +08:00
    @enenaaa r 和 b 前缀可以同时使用, rb'\u60a8'
    虽说也没啥问题(
    whwq2012
        12
    whwq2012  
       2017-04-17 12:28:19 +08:00 via Android
    我也在 v2 问过这个问题
    1OF7G
        13
    1OF7G  
    OP
       2017-04-17 13:10:23 +08:00   ❤️ 1
    @est #5
    @onlyice #7
    @enenaaa #9

    你们说的 byte 转换到 str ,看了半天不明白,才发现原来 b'\\u60a8'== b'\u60a8'这两个相等!
    所以最佳方法应该是:
    r'\u60a8'.encode('utf-8').decode('unicode_escape')
    '您'
    flniu
        14
    flniu  
       2017-04-17 13:10:56 +08:00
    楼上的朋友们看清楼主的问题了吗?
    r'\u60a8' 和 '\u60a8' 完全不是一回事啊。
    flniu
        15
    flniu  
       2017-04-17 13:17:30 +08:00
    哦,楼上是 Python2 的示例,看错……
    Python2 的 r'\u60a8' 等价于 Python3 的 rb'\u60a8' 和 r'\u60a8'.encode()
    1OF7G
        16
    1OF7G  
    OP
       2017-04-17 14:30:31 +08:00
    画了个图,蓝色的方框是 Python3 表达式,大方框内表示等价的同一对象
    这个问题最佳方法应该是:
    >>> r'\u60a8'.encode('utf-8').decode('unicode_escape')
    '您'
    根据图片就很容易理解了
    jason19659
        17
    jason19659  
       2017-04-17 20:36:58 +08:00
    java : System.out.println("\u60a8");
    Kisesy
        18
    Kisesy  
       2017-04-17 21:14:25 +08:00
    @jason19659 py 也一样啊
    print("\u60a8")
    # >> 您

    不过跟楼主说的这个不一样,楼主这个需求类似把 json 里的 unicode 解析成正常文本
    jason19659
        19
    jason19659  
       2017-04-17 22:42:17 +08:00
    @Kisesy #18 这个 json 库应该都有参数能解析
    Hyvi
        20
    Hyvi  
       2018-09-13 11:33:01 +08:00
    @1OF7G b 开头,rb 开头,\u 啥意思?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2870 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:16 · PVG 22:16 · LAX 06:16 · JFK 09:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.