使用基数为 10 的整数转义序列解码 unicode 字符串



作为输入,我得到这样的字符串

Funda195131194167195131194163o

我从Cymru Whois服务中获得的:

$ dig +short AS10417.asn.cymru.com TXT
"10417 | BR | lacnic | 2000-02-15 | Funda195131194167195131194163o de Desenvolvimento da Pesquisa, BR"

正确解码将导致:

Fundação

在六位表示法中,这是:

b'xc3xa7xc3xa3'

其中 0xc3 为 195,0xa7为 167,0xa3为 163,与每个四元组的第一个和最后一个字符的数字相匹配。

所以,195131194167ç195131194163.看起来Python无法解码它,至少使用默认参数。

这种编码是否常见,Python 中是否有任何内置功能来通用解码(当然不是特定于此字符串)?

这里的诀窍是在re.sub中使用自定义替换例程:

如果repl是一个函数,则每次不重叠的pattern都会调用它。该函数采用单个匹配对象参数,并返回替换字符串。

要将字符串转换为可打印字符,请使用latin1将其编码bytes,这将保留所有文字字节代码,然后将其解码为 UTF-8:

import re
text = r'Funda195131194167195131194163o'
print (bytes('Fundação','utf8')) # This is our target
print (bytes(re.sub (r'\(d+)', lambda x: chr(int(x.group(1))), text).encode('latin1')).decode('utf-8'))

但是,您的文本不是简单的 UTF-8 编码,而是双重编码!

b'Fundaxc3xa7xc3xa3o'
Fundação

因此,将其解码为 UTF-8会产生另一个 UTF-8 编码字符串。我们需要翻译两次

# This first line prints the byte values so you can compare it to the UTF-8 target:
print (bytes(re.sub (r'\(d+)', lambda x: chr(int(x.group(1))), text).encode('latin1')).decode('utf-8').encode('latin1'))
print (bytes(re.sub (r'\(d+)', lambda x: chr(int(x.group(1))), text).encode('latin1')).decode('utf-8').encode('latin1').decode('utf8'))

要最终获得输出,请执行以下操作:

b'Fundaxc3xa7xc3xa3o'
Fundação

最新更新