为什么我不能使用 utf-8 解码任何字节?

Why can't I decode any byte using utf-8?

不是编码专家,正在努力学习。

我得到一个拉丁编码的文件,当我试图读取它并使用 'utf-8' 解码时,我收到以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 0: invalid start byte

为什么 utf-8(每个字符使用 1-4 个字节)不能解码 latin1(每个字符 1 个字节)。

latin1 是 utf-8 的子集吗?我对此很迷茫,所以任何帮助。

混淆了两个不同的概念。

一个字符集是字符的排序,编号从0到...

编码 是一种将字符集中的数字表示为字节序列的方法。


对于最多 256 个字符的字符集,简单的单字节编码是可能的。

对于较大的字符集,需要多字节编码。它们可以分为两种类型:固定大小,其中每个字符使用相同的字节数,以及可变大小,其中使用不同的字节数来表示不同的字符。

固定大小编码的示例都是单字节编码和 UTF-32。

可变大小编码的示例是 UTF-8 和各种 UTF-16 编码。


Latin-1既是字符集(包含ASCII字符及其用于书写西欧语言的附加字符)又是(有256个字符)其对应的单字节编码

Unicode是一个字符集,包含(或旨在包含)编写所有已知语言的所有字符。毫不奇怪,它比 256 个字符大得多。

UTF-8 只是 Unicode 的一种多字节编码,而且是一种可变大小的编码。每个 UTF-8 序列的第一个字节告诉您如何 附加 个字节跟随它来编码单个 Unicode 代码点。

Unicode 和 Latin-1(字符集)的前 256 个代码点一致。也就是说,Latin-1 是 Unicode 的一个子集。

UTF-8 和 Latin-1 的前 128 个序列一致。之后,他们发生分歧。在 UTF-8 中,代码点 128 到 255 需要两个字节。第一个字节的形式为 110xxxxx,第二个字节为 10xxxxxx。 11 个 x 位可用于编码 Unicode 的其余 Latin-1 子集(加上附加块)。

字节 0xa0 不是有效的 UTF-8,因为它的二进制扩展是 10100000。多字节 UTF-8 序列的第一个字节总是至少以 two[=45 开头=] 1s(直观上,1的个数表示序列中的字节数)。