2

我的目标是将base64编码的“%EB”字符串转换为“\xEB”。但是,我一尝试,就发现这很难,并且无法通过 string.replace 或 re.sub 两者来实现。

我的代码失败如下:

target = '%EB%AF%B8%EB%9F%AC%EC%8A%A4%20%EC%97%A3%EC%A7%80'

target.replace('%','\x')
-> ValueError: invalid \x escape

re.sub('%','\x',target)
-> ValueError: invalid \x escape

更新:

感谢您的评论,我尝试了 '\x' 和 r'\x',但是,这些似乎不是解决方案。

例如,

target = '%EB%AF%B8%EB%9F%AC%EC%8A%A4%20%EC%97%A3%EC%A7%80'
converted1 = target.replace('%',r'\x')
converted2 = target.replace('%','\\x')
converted1
-> '\\xEB\\xAF\\xB8\\xEB\\x9F\\xAC\\xEC\\x8A\\xA4\\x20\\xEC\\x97\\xA3\\xEC\\xA7\\x80'
converted2
-> '\\xEB\\xAF\\xB8\\xEB\\x9F\\xAC\\xEC\\x8A\\xA4\\x20\\xEC\\x97\\xA3\\xEC\\xA7\\x80'

结果:

print converted1
\xEB\xAF\xB8\xEB\x9F\xAC\xEC\x8A\xA4\x20\xEC\x97\xA3\xEC\xA7\x80
print converted2
\xEB\xAF\xB8\xEB\x9F\xAC\xEC\x8A\xA4\x20\xEC\x97\xA3\xEC\xA7\x80

我想要的是:

print "\xEB\xAF\xB8\xEB\x9F\xAC\xEC\x8A\xA4\x20\xEC\x97\xA3\xEC\xA7\x80"
미러스 엣지
4

3 回答 3

8

该方法replace无法解码 URL 安全字符串。它只是将字符替换%\x. 如果要解码 URL 安全字符串,则应使用urllib.unquote.

import urllib
target = '%EB%AF%B8%EB%9F%AC%EC%8A%A4%20%EC%97%A3%EC%A7%80'
print urllib.unquote(target)
于 2013-06-13T08:12:37.443 回答
6
>>> target = '%EB%AF%B8%EB%9F%AC%EC%8A%A4%20%EC%97%A3%EC%A7%80'
>>> target.replace('%',r'\x')
'xEBxAFxB8xEBx9FxACxECx8AxA4x20xECx97xA3xECxA7x80'

为什么 '\x' 在 Python 中无效?

对于代码的第二部分,请使用:

print target.replace('%',r'\x').decode('string-escape')

虽然这可以解决您的错误,但最好的解决方案是@kamae

于 2013-06-13T07:48:40.153 回答
1

我认为您错过了交互式 Python 的 CLI 和 Python 源代码之间的区别。您在代码中实际执行的操作是将字符串中的字符“%”更改为“\x”字符。

你在 Python 的命令行中所做的是输入字符串,并在创建字符串的那一刻(当你按下Enter时)解释转义码。然后,您的字符串是 unicode 并包含韩语字符的二进制表示。

在 Python 中将 unicode 代码点转换为 UTF8 十六进制可能会对您有所帮助。

于 2013-06-13T08:14:22.323 回答