请教一个编码问题,将 r'\u60a8' 本身带反斜杠的 string"解码"为汉字? - V2EX
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 6561 次点击
    这是一个创建于 3099 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这么一个字符串: \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/span>
    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'
    虽说也没啥问题(
    syahd
        12
    syahd  
       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     Solana     2346 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 15:47 PVG 23:47 LAX 08:47 JFK 11:47
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86