首页 > 解决方案 > 波兰语字母的字符编码和解码处理方式不同

问题描述

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

当然,这些名字不止两个。

第一个应该看起来像piaseczyński,第二个看起来不错。但是当我使用一些操作来修复它时: str(entity_name).encode('1252').decode('utf-8')然后第一个是固定的,但是第二个返回错误: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf3 in position 8: invalid continuation byte

为什么波兰字母不被同等对待?如何解决?

标签: pythonunicodepolish

解决方案


您可能已经意识到,这些字符串具有不同的编码。最好的方法是在源头修复它,以便它始终返回 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. 如果你得到一个非 UTF-8 编码的字符串,它不是 Windows 代码页 1252。欧洲另一个常见的编码是 ISO-8859-1 (Latin-1)。在一个中有效的每个字节串在另一个中也有效。

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


推荐阅读