字符的编码和解码与波兰语字母的处理方式不同

Encoding and decoding for chars are not treated the same for polish letters

从其他来源我得到两个带有两个波兰语字母的名字(ńó),如下所示:

当然这些名字不止两个

第一个应该看起来像 piaseczyński,第二个看起来不错。但是当我使用一些操作来修复它时: str(entity_name).encode('1252').decode('utf-8') 然后第一个是固定的,但是第二个 return 错误: UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 8 中的字节 0xf3:连续字节无效

为什么波兰语字母的处理方式不同? 如何解决?

您可能已经意识到,这些字符串具有不同的编码。最好的方法是在源头上修复它,以便它始终 return 是 UTF-8(或至少是一些一致的已知编码)。

如果你真的做不到,你应该首先尝试解码为 UTF-8,因为它更严格:并非每个字节串都是有效的 UTF-8。如果得到 UnicodeDecodeError,尝试将其解码为其他编码:

def decode_crappy_bytes(b):
    try:
        return b.decode('utf-8')
    except UnicodeDecodeError:
        return b.decode('1252')

请注意,这仍然会以两种方式失败:

  1. 如果您得到一个采用某种非 UTF-8 编码的字符串,而该字符串恰好也可以解码为 UTF-8。
  2. 如果您得到的字符串不是 Windows 代码页 1252 的非 UTF-8 编码。欧洲的另一个常见编码是 ISO-8859-1 (Latin-1)。在一个中有效的每个字节串在另一个中也有效。

如果您确实需要处理多种不同的非 UTF-8 编码并且您知道它应该是波兰语,则可以计算每个可能的解码中非 ASCII 波兰语字母的数量,并且 [=27= 】 得分最高的那个。仍然不是万无一失的,所以真的,最好从源头上解决它。

@Thomas 我添加了另一个 except 然后现在可以正常工作了:

try:
    entity_name = entity_name.encode('1252').decode('utf-8')
except UnicodeDecodeError:
    pass
except UnicodeEncodeError:
    pass

通过 żarski