【问题标题】:UnicodeDecodeError: 'ascii' codec can't decode byte 0xa7 in position 0: not in ordinal range (128)UnicodeDecodeError:“ascii”编解码器无法解码位置 0 的字节 0xa7:不在序数范围内 (128)
【发布时间】:2020-11-06 04:20:12
【问题描述】:

我有一个十六进制字符串,表示为包含一些文本的单个字符列表。当我尝试使用以下命令解码十六进制时:

for counter, i in enumerate(hexadecimal):
    if counter % 2 == 0:
        pass
    else:
        temp_list = hexadecimal[counter:counter + 2]
        hex_string = ''.join(str(x) for x in temp_list)
        bytes_string = bytes.fromhex(hex_string)
        ascii_text += bytes_string.decode('ascii')

它工作正常,但是当它遇到数字 ['A', 7] 时,它给了我这个错误。 我认为这是因为该字符在 ASCII 中不存在,我如何从中制作一个可读的字符?

编辑:

一个示例输入是[6, 1, 6, 2, 6, 3],它产生abc作为输出。

程序输入是[0, 'F', 3, 4, 3, 0, 2, 'E', 3, 0, 3, 1, 5, 6, 2, 0, 3, 4, 3, 7, 3, 2, 3, 3, 4, 1, 4, 1, 3, 3, 5, 1],产生40.01V 4723AA3Q

【问题讨论】:

  • 你为什么要打电话给decode('ascii')? Python 3 中的字符串是 Unicode。您需要确定 hexadecimal 中使用的编码并使用 that 将字节转换为文本。如果编码为 UTF8,则使用 'utf-8` 作为编码
  • 另一方面,hexadecimal 是什么?它包含什么,它来自哪里?您不能直接从文件或 HTTP 响应中读取实际字符串吗?将文本存储为十六进制字符串而不是实际文本是非常不寻常的 - 它实际上比仅存储字符串本身需要更多空间。 hexadecimal 可能是 BASE64 字符串吗?
  • hexadecimal 包含一系列表示十六进制的字符,例如 ['A', 5, 6, 'D', 3, 4] 我不知道使用哪种编码我只得到那些值作为十六进制,但 ASCII 产生正确的结果,直到我得到错误
  • @AlePan 不,它没有。如果是这样,您将收到如下错误:“ValueError: non-hexadecimal number found in fromhex() arg at position 1”。请编辑您的问题并为hexadecimal 显示一些真实示例输入,这些输入会产生您所说的错误,并清楚地说明您期望获得的输出。
  • A7 不是有效的 ASCII 字符,句点。也许它代表 Latin-1 中的一个字符,或其他无数编码之一。但不是ASCII。在不知道 A7应该代表什么的情况下,我们无法给你一个真正的答案。

标签: python ascii python-unicode


【解决方案1】:

如果您希望能够将任何字节表示为可接受的字符,则应使用 Latin-1 或 ISO-8859-1 编码(2 个名称但相同的字符集)。任何字节都被接受,即使有些不是可打印的字符。如果存在,则表示是相同值的 unicode 字符(当然最多 255)。

对于你的问题,'\xa7' 将是 unicode 字符 U+00A7 SECTION SIGN §

所以你只需要改变你的最后一行:

ascii_text += bytes_string.decode('Latin1')

【讨论】:

  • “Latin-1”是一个有点非正式的名称,根据您询问的对象可以与 ISO-8859-1 略有不同。此外,它根本不必是 Latin-1,任何使用 256 个值的单字节编码都可以……
  • @deceze:我不同意。 Latin1 是 ISO-8859-1 的真正同义词。我不说它的变体,如 windows 代码页 1252 的 Latin-9(ISO-8859-15 的同义词)。Latin1 具有表示代码 具有相同值的所有 unicode 字符的独特功能。您确实可以使用任何使用 256 值的编码,但如果没有更多上下文,我会先建议它。
猜你喜欢
  • 2011-05-13
  • 2014-02-19
  • 2018-07-26
  • 2014-08-12
  • 2013-09-20
  • 2016-07-05
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多