将拉丁1字符的字节解码为十进制字符串



我正在进行一个迁移项目,将一层web服务器从python 2.7.8升级到python 3.6.3,我遇到了一些特殊情况的障碍。当从客户端接收到请求时,使用pyzmq在本地传输有效载荷,pyzmq现在在python3中的bytes中交互,而不是在str中交互(就像在python2中一样(。

现在,我正在接收的有效载荷是使用iso-8859-1(latin-1(方案编码的,我可以很容易地将其转换为字符串作为有效载荷。解码('latin-1'(vc保存实体(,该服务需要字符串参数。

但是,后续服务">svc save entity"希望非拉丁-1字符(如果存在(以ASCII字符引用(如é表示é(表示,而不是以十六进制表示(如xe9表示é(。

我正在努力寻找一种有效的方法来实现这种转变。有蟒蛇专家可以在这里指导我吗?本质上,我需要一个函数的定义,比如decode_tostring():

payload = b'Banco Santander (Mxe9xico)'         #payload is in bytes
payload_str = decode_tostring(payload)           #function to convert into string
payload_str == 'Banco Santander (México)'  #payload_str is a string in ASCII Character Reference

请定义decode_tostring():)

encode()decode()方法接受一个名为errors的参数,该参数允许您指定如何处理在指定编码中不可表示的字符。您正在寻找的是XML数字字符引用替换,幸运的是,它是codecs模块中提供的标准处理程序之一。

现在,按照您想要的方式进行替换是一个非常复杂的操作,因为用相应的XML数字字符引用替换非ASCII字符的操作发生在编码期间,而不是解码期间。毕竟,编码是接收字符并发送字节的过程,所以只有在编码过程中,才能判断是否有不属于ASCII的字符。目前,我能想到的获得所需转换的最干净的方法是解码、重新编码和重新解码,在编码步骤中应用XML实体引用替换。

def decode_tostring(payload):
return payload.decode('latin-1').encode('ascii', errors='xmlcharrefreplace').decode('ascii')

如果有一种方法可以将字符串中的所有非ASCII字符替换为它们的XML数字字符引用,并返回一个字符串,我不会感到惊讶,如果是这样,你可以用它来替换编码和第二次解码。但我不知道有哪个。我目前发现的最接近的是xml.sax.saxutils.escape(),但它只作用于某些特定的角色。


这与您的主要问题并不相关,但我确实想澄清一件事:像é这样的数字实体是SGML、HTML和XML的一个功能,它们是标记语言,是将结构化数据表示为文本的一种方式。它们与ASCII无关。像ASCII这样的字符编码只不过是一个由一些字符和一些字节序列组成的表,这样表中的每个字符都映射到表中的一个字节序列,反之亦然,只需要一些约束即可使映射变得明确。

如果字符串中的字符不在特定编码的表中,则无法使用该编码对该字符串进行编码。但是可以将不在表中的字符替换为在表中的字符序列,将字符串转换为新字符串,然后对新字符串进行编码。有很多方法可以进行替换,其中XML数字实体引用就是一个例子。Python的codecs模块中的一些其他错误处理程序代表了这种替换的其他方法。

最新更新