作为输入,我得到这样的字符串
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