在python中的(扩展)url编码中的Unescape / unquote二进制字符串

时间:2009-08-19 07:33:14

标签: python binary urlencode

进行分析我不得不忽视URL编码的二进制字符串(最可能是不可打印的字符)。遗憾的是,字符串以扩展的URL编码形式出现,例如, “%u616f”。我想将它们存储在一个文件中,然后包含原始二进制值,例如。这里是0x61 0x6f。

如何在python中将其转换为二进制数据? (urllib.unquote只处理“%HH”-form)

3 个答案:

答案 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