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

2017-04-17 09:27:56 +08:00
 1OF7G

这么一个字符串: \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 友赐教!

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

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

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

不过跟楼主说的这个不一样,楼主这个需求类似把 json 里的 unicode 解析成正常文本
jason19659
2017-04-17 22:42:17 +08:00
@Kisesy #18 这个 json 库应该都有参数能解析
Hyvi
2018-09-13 11:33:01 +08:00
@1OF7G b 开头,rb 开头,\u 啥意思?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/355312

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX