Ach*_*ena 5 python iso-8859-1 python-3.x python-3.6
我正在开展一个迁移项目,将 Web 服务器层从 python 2.7.8 升级到 python 3.6.3,并且在某些特殊情况下遇到了障碍。\n当从客户端收到请求时,有效负载将使用本地传输pyzmq 现在在bytespython3 中交互,而不是str(像在 python2 中一样)。
现在,我收到的有效负载使用iso-8859-1 (latin-1)方案进行编码,我可以轻松地将其转换为字符串作为payload.decode('latin-1')并将其传递给下一个服务(svc- save-entity)需要字符串参数。
\n但是,后续服务“ svc-save-entity ”期望非 latin-1 字符(如果存在)以 ASCII 字符引用(例如éfor \xc3\xa9)而不是十六进制(例如\\xe9for \xc3\xa9)表示。
我正在努力寻找一种有效的方法来实现这种转换。任何Python专家都可以指导我吗?本质上我需要一个函数的定义decode_tostring():
payload = b'Banco Santander (M\\xe9xico)' #payload is in bytes\npayload_str = decode_tostring(payload) #function to convert into string\npayload_str == 'Banco Santander (México)' #payload_str is a string in ASCII Character Reference\nRun Code Online (Sandbox Code Playgroud)\n请的定义decode_tostring()。:)
和方法接受一个名为 的参数,该encode()参数允许您指定如何处理在指定编码中无法表示的字符。您正在寻找的是 XML 数字字符引用替换,幸运的是,它是模块中提供的标准处理程序之一。decode()errorscodecs
现在,按照您想要的方式实际进行替换有点复杂,因为用相应的 XML 数字字符引用替换非 ASCII 字符的操作发生在编码过程中,而不是解码过程中。毕竟,编码是接收字符并发出字节的过程,因此只有在编码过程中,您才能判断是否有不属于 ASCII 的字符。目前我能想到的获得所需转换的最简洁方法是解码、重新编码和重新解码,在编码步骤中应用 XML 实体引用替换。
def decode_tostring(payload):
return payload.decode('latin-1').encode('ascii', errors='xmlcharrefreplace').decode('ascii')
Run Code Online (Sandbox Code Playgroud)
如果有一种方法可以用 XML 数字字符引用替换字符串中的所有非 ASCII 字符并返回一个字符串,我不会感到惊讶,如果是这样,您可以使用它来替换编码以及第二次解码。但我不知道有一个。目前我发现的最接近的是xml.sax.saxutils.escape(),但它只作用于某些特定的角色。
这与您的主要问题并不真正相关,但我确实想澄清一件事:像这样的数字实体é是 SGML、HTML 和 XML 的一项功能,它们是标记语言 - 一种将结构化数据表示为文本的方式。它们与 ASCII 无关。像 ASCII 这样的字符编码只不过是一些字符和一些字节序列的表,这样表中的每个字符都映射到表中的一个字节序列,反之亦然,有一些约束可以使映射明确。
如果字符串中的字符不在特定编码表中,则无法使用该编码对该字符串进行编码。但是您可以做的是将字符串转换为新字符串,方法是将表中不存在的字符替换为表中的字符序列,然后对新字符串进行编码。有多种方法可以进行替换,XML 数字实体引用就是其中之一。Python 模块中的一些其他错误处理程序codecs代表了这种替换的其他方法。
| 归档时间: |
|
| 查看次数: |
1858 次 |
| 最近记录: |