将具有 latin-1 字符的字节解码为具有十进制表示的字符串
Decoding a byte with latin-1 characters to string with decimal representation
我正在进行一个迁移项目,将 Web 服务器的一层从 python 2.7.8 升级到 python 3.6.3,我遇到了一些特殊情况的障碍。
当从客户端收到请求时,使用 pyzmq 在本地传输有效负载,它现在在 python3 中的 bytes
中交互,而不是 str
(因为它在 python2 中) .
现在,我收到的有效载荷使用 iso-8859-1 (latin-1) 方案编码,我可以轻松地将其转换为字符串 payload.decode('latin-1') 并将其传递给需要字符串参数的下一个服务 (svc-save-entity)。
但是,后续服务“svc-save-entity”期望 latin-1 字符(如果存在)以 ASCII 字符参考(例如 é
表示 é
) 而不是十六进制(例如 \xe9
表示 é
)。
我正在努力寻找一种有效的方法来实现这种转换。 python 专家可以指导我吗?本质上我需要一个函数的定义说 decode_tostring()
:
payload = b'Banco Santander (M\xe9xico)' #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
的参数,它允许您指定如何处理指定编码中未表示 table 的字符.你要找的是 XML numeric character reference replacement,幸运的是 one of the standard handlers 在 codecs
模块中提供。
现在,按照您想要的方式实际进行替换是一个 小 复杂的过程,因为用相应的 XML 数字替换非 ASCII 字符的操作字符引用发生在 编码 期间,而不是解码期间。毕竟,编码是接收字符并发出字节的过程,因此只有在编码期间,您才能判断是否有不属于 ASCII 的字符。目前我能想到的获得所需转换的最简洁方法是解码、重新编码和重新解码,在编码步骤中应用 XML 实体引用替换。
def decode_tostring(payload):
return payload.decode('latin-1').encode('ascii', errors='xmlcharrefreplace').decode('ascii')
如果有某种方法可以用 XML 数字字符引用替换字符串中的所有非 ASCII 字符并返回一个字符串,我不会感到惊讶,如果是的话,你可以用它来代替编码和二次解码。但我不知道一个。我目前找到的最接近的是 xml.sax.saxutils.escape()
,但它只作用于某些特定字符。
这与您的主要问题并不相关,但我确实想澄清一件事:numeric entities like é
是 SGML、HTML 和 XML 的一个特性,这是标记语言——一种将结构化数据表示为文本的方法。它们与 ASCII 无关。像 ASCII 这样的字符编码只不过是一些字符和一些字节序列的 table,这样 table 中的每个字符都映射到 table 中的一个字节序列,反之亦然,有一些限制使映射明确。
如果您的字符串包含不在特定编码 table 中的字符,则无法使用该编码对字符串进行编码。但是您 可以 做的是通过将不在 table 中的字符替换为 中的字符序列来将字符串转换为新字符串 =36=] 在 table 中,然后对新字符串进行编码。替换的方法有很多种,XML数字实体引用就是一个例子。 Python 的 codecs
模块中的一些其他错误处理程序代表了此替换的其他方法。
我正在进行一个迁移项目,将 Web 服务器的一层从 python 2.7.8 升级到 python 3.6.3,我遇到了一些特殊情况的障碍。
当从客户端收到请求时,使用 pyzmq 在本地传输有效负载,它现在在 python3 中的 bytes
中交互,而不是 str
(因为它在 python2 中) .
现在,我收到的有效载荷使用 iso-8859-1 (latin-1) 方案编码,我可以轻松地将其转换为字符串 payload.decode('latin-1') 并将其传递给需要字符串参数的下一个服务 (svc-save-entity)。
但是,后续服务“svc-save-entity”期望 latin-1 字符(如果存在)以 ASCII 字符参考(例如 é
表示 é
) 而不是十六进制(例如 \xe9
表示 é
)。
我正在努力寻找一种有效的方法来实现这种转换。 python 专家可以指导我吗?本质上我需要一个函数的定义说 decode_tostring()
:
payload = b'Banco Santander (M\xe9xico)' #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
的参数,它允许您指定如何处理指定编码中未表示 table 的字符.你要找的是 XML numeric character reference replacement,幸运的是 one of the standard handlers 在 codecs
模块中提供。
现在,按照您想要的方式实际进行替换是一个 小 复杂的过程,因为用相应的 XML 数字替换非 ASCII 字符的操作字符引用发生在 编码 期间,而不是解码期间。毕竟,编码是接收字符并发出字节的过程,因此只有在编码期间,您才能判断是否有不属于 ASCII 的字符。目前我能想到的获得所需转换的最简洁方法是解码、重新编码和重新解码,在编码步骤中应用 XML 实体引用替换。
def decode_tostring(payload):
return payload.decode('latin-1').encode('ascii', errors='xmlcharrefreplace').decode('ascii')
如果有某种方法可以用 XML 数字字符引用替换字符串中的所有非 ASCII 字符并返回一个字符串,我不会感到惊讶,如果是的话,你可以用它来代替编码和二次解码。但我不知道一个。我目前找到的最接近的是 xml.sax.saxutils.escape()
,但它只作用于某些特定字符。
这与您的主要问题并不相关,但我确实想澄清一件事:numeric entities like é
是 SGML、HTML 和 XML 的一个特性,这是标记语言——一种将结构化数据表示为文本的方法。它们与 ASCII 无关。像 ASCII 这样的字符编码只不过是一些字符和一些字节序列的 table,这样 table 中的每个字符都映射到 table 中的一个字节序列,反之亦然,有一些限制使映射明确。
如果您的字符串包含不在特定编码 table 中的字符,则无法使用该编码对字符串进行编码。但是您 可以 做的是通过将不在 table 中的字符替换为 中的字符序列来将字符串转换为新字符串 =36=] 在 table 中,然后对新字符串进行编码。替换的方法有很多种,XML数字实体引用就是一个例子。 Python 的 codecs
模块中的一些其他错误处理程序代表了此替换的其他方法。