进行分析我不得不忽视URL编码的二进制字符串(最可能是不可打印的字符)。遗憾的是,字符串以扩展的URL编码形式出现,例如, “%u616f”。我想将它们存储在一个文件中,然后包含原始二进制值,例如。这里是0x61 0x6f。
如何在python中将其转换为二进制数据? (urllib.unquote只处理“%HH”-form)
答案 0 :(得分:3)
字符串遗憾地以扩展的URL编码形式出现,例如“%u616f”
顺便说一句,这与URL编码没有任何关系。它是由JavaScript escape()函数生成的任意伪造格式,几乎没有别的。如果可以,最好的办法是更改JavaScript以使用encodeURIComponent函数。这将为您提供正确的,标准的URL编码的UTF-8字符串。
e.g。 “%u616f”。我想将它们存储在一个文件中,然后包含原始二进制值,例如。这里是0x61 0x6f。
你确定0x61 0x6f(字母“ao”)是你要存储的字节流吗?这意味着UTF-16BE编码;你是用这种方式处理所有的字符串吗?
通常,您希望将输入转换为Unicode,然后使用适当的编码将其写出,例如UTF-8或UTF-16LE。这是一个快速的方法,依赖于让Python读取'%u1234'作为字符串转义格式u'\ u1234':
>>> ex= 'hello %e9 %u616f'
>>> ex.replace('%u', r'\u').replace('%', r'\x').decode('unicode-escape')
u'hello \xe9 \u616f'
>>> print _
hello é 慯
>>> _.encode('utf-8')
'hello \xc2\xa0 \xe6\x85\xaf'
答案 1 :(得分:1)
我猜你必须自己编写解码器功能。这是一个让您入门的实现:
def decode(file):
while True:
c = file.read(1)
if c == "":
# End of file
break
if c != "%":
# Not an escape sequence
yield c
continue
c = file.read(1)
if c != "u":
# One hex-byte
yield chr(int(c + file.read(1), 16))
continue
# Two hex-bytes
yield chr(int(file.read(2), 16))
yield chr(int(file.read(2), 16))
用法:
input = open("/path/to/input-file", "r")
output = open("/path/to/output-file", "wb")
output.writelines(decode(input))
output.close()
input.close()
答案 2 :(得分:0)
这是一种基于正则表达式的方法:
# the replace function concatenates the two matches after
# converting them from hex to ascii
repfunc = lambda m: chr(int(m.group(1), 16))+chr(int(m.group(2), 16))
# the last parameter is the text you want to convert
result = re.sub('%u(..)(..)', repfunc, '%u616f')
print result
给出
ao