请教 python 字符串编码问题

2014-08-22 11:32:32 +08:00
 berry10086
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')
请问怎样显示为中文?
4686 次点击
所在节点    Python
30 条回复
manfay
2014-08-22 12:04:01 +08:00
好有趣,真的不容易转,因为 '\' 和 '\x' 都是转义符。

等高手解答……
wangyongbo
2014-08-22 12:09:52 +08:00
print ssid
重新复制一遍
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
2014-08-22 12:17:30 +08:00
@binux 我开始也这么以为,后来发现这个含义是 '\\' + 'xE4',硬是不能在程序内改成 '\xE4'
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
2014-08-22 12:19:37 +08:00
@wangyongbo 不行,print之后是\xe4
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
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
2014-08-22 12:22:04 +08:00
@wangyongbo 谢谢😜
berry10086
2014-08-22 12:22:17 +08:00
@ehs2013 谢谢😊
binux
2014-08-22 12:30:42 +08:00
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
2014-08-22 12:32:33 +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 s.decode('string-escape')
不是你的网你连个啥嘞
dbow
2014-08-22 12:33:06 +08:00
@wangyongbo
@ehs2013
更加简洁高效的: print ssid.replace("\\x", "").decode("hex")
dbow
2014-08-22 12:39:33 +08:00
@skybr 赞string-escape.
iptux
2014-08-22 12:40:32 +08:00
"不是你的网你连个啥嘞"
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
2014-08-22 12:42:44 +08:00
比 @skybr 慢了。
hahastudio
2014-08-22 12:44:02 +08:00
来一个好玩的
>>> print eval('"%s"' % ssid)
不是你的网你连个啥嘞
hahastudio
2014-08-22 12:45:11 +08:00
比 @binux 慢了。。。好久= =
hahastudio
2014-08-22 12:46:58 +08:00
突然想起来
There should be one-- and preferably only one --obvious way to do it.
然后觉得满脸黑线= =

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

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

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

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

© 2021 V2EX