【发布时间】:2021-10-02 08:49:37
【问题描述】:
我有一个 python 模块,我需要从 py2 适应到 py3。问题是,它接受来自 C++ 模块的 std::string 作为结构的一部分,因为默认的 py2 字符串类型是 bytes,所以它在 py2 中是可读的。但是,当尝试使用 py3 启动它时,每当我尝试对它执行任何操作时,它都会尝试使用 utf8 解释该字符串。
基本上,消息反序列化器需要一个类似字节的对象,但是却得到一个普通的,虽然不可读的字符串。
例如,这不起作用:
msg_raw_data = bytes(msg.raw_data, encoding='latin-1')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 4: invalid start byte
不幸的是,我无法更改字符串进入模块的方式,但我不需要将该字符串作为实际有效字符串读取 - 我只需要从中提取 bytes 对象而不丢弃任何值。有没有办法做到这一点?
【问题讨论】:
-
这只是字符解码问题,尝试不同的编码如
windows-1252:stackoverflow.com/a/48067785/1399491 -
我尝试了几种不同的编码,我在各种 SO 问题中找到了这些编码,包括
windows-1252、ascii、latin-1、string_escape、unicode_escape、raw_unicode_escape、但到目前为止,它们都没有奏效。 -
您是否尝试过使用 chardet 之类的东西?
-
不,但问题是,与您链接的问题中的人不同,我在打开文件时没有选择编码的奢侈 - 我得到的是直接的字符串对象发送它的服务很可能发送
bytes对象。这就是为什么我不需要尝试将其解码为字符串,而我只需要一种方法来提取底层字节而不丢弃它们(因此不能使用 errors='ignore' 参数)。
标签: python-3.x python-2.x