【问题标题】:Converting string to bytes gives UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 4: invalid start byte将字符串转换为字节给出 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 4: invalid start byte
【发布时间】: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-1252asciilatin-1string_escapeunicode_escaperaw_unicode_escape、但到目前为止,它们都没有奏效。
  • 您是否尝试过使用 chardet 之类的东西?
  • 不,但问题是,与您链接的问题中的人不同,我在打开文件时没有选择编码的奢侈 - 我得到的是直接的字符串对象发送它的服务很可能发送bytes 对象。这就是为什么我不需要尝试将其解码为字符串,而我只需要一种方法来提取底层字节而不丢弃它们(因此不能使用 errors='ignore' 参数)。

标签: python-3.x python-2.x


【解决方案1】:

由于缺乏更好的选择,不得不要求 C++ 团队更改他们的 python 绑定以从他们这边返回 bytes 包装器而不是 std::string

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 2020-12-26
    • 1970-01-01
    • 2018-10-15
    • 2021-11-24
    • 2021-07-21
    • 2022-09-26
    • 2020-03-12
    • 2020-05-08
    相关资源
    最近更新 更多