【问题标题】:Python3, issues using ctf-8 encode/decode (on some ocassions)Python3,使用 utf-8 编码/解码的问题(在某些情况下)
【发布时间】:2018-10-29 05:18:05
【问题描述】:

所以,我遇到了 Python3 编码问题。我有几个字节想作为字符串工作。 (长篇大论)

简而言之,这是可行的

a = "\x85".encode()
print(a.decode())

但这不是

b = (0x85).to_bytes(1,"big")
print(b.decode())

UnicodeDecodeError:utf-8 编解码器无法解码位置 0 中的字节 0x85: 无效的起始字节

我已经阅读了一些关于该主题的文章,但他们坚持认为“python3 已损坏”或“您不应该为此使用字符串”。 Stackoverflow 上的很多文章只是使用“变通方法”(例如“错误时使用替换”或“用户 utc-16”)。

谁能告诉我区别在哪里以及为什么该功能有效而第二个无效?他们两个不应该工作相同吗?为什么 utf-8 在第二次尝试时无法解码字节?

【问题讨论】:

    标签: python python-3.x unicode codec


    【解决方案1】:

    在第一种情况下,'\x85'.encode() 将 Unicode 代码点 U+0085 编码为 Python 3 默认编码的 UTF-8。所以输出是该代码点的正确的两字节 UTF-8 编码:

    >>> '\x85'.encode()
    b'\xc2\x85'
    

    然后解码可以正常工作,因为它以 UTF-8 开始正确编码:

    >>> b'\xc2\x85'.decode()
    '\x85'
    

    第二种情况是创建单字节字符串的复杂方式:

    >>> (0x85).to_bytes(1,'big')
    b'\x85'
    

    此字节字符串未正确编码为 UTF-8,因此无法解码:

    >>> b'\x85'.decode()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0x85 in position 0: invalid start byte
    

    Python 3 绝对没有“坏掉”。它干净地将字节数据与文本分开。 如果您有原始字节,请将它们作为字节使用。 Python 3 中的原始数据旨在以字节字符串或字节数组的形式进行操作。 Unicode 字符串用于文本。将字节解码为文本以对其进行操作,然后编码回字节以序列化为文件、套接字、数据库等。

    如果出于某种原因您觉得需要对原始数据使用 Unicode 字符串,则 Unicode 的前 256 个代码点对应于 latin1 编解码器,用于一对一映射。

    >>> '\x85'.encode('latin1')
    b'\x85'
    >>> b'\x85'.decode('latin1')
    '\x85'
    

    这通常用于纠正由于使用错误编码进行编码/解码而导致的编程错误。

    【讨论】:

      猜你喜欢
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2013-03-26
      • 2018-02-18
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多