字符的编码和解码与波兰语字母的处理方式不同
Encoding and decoding for chars are not treated the same for polish letters
从其他来源我得到两个带有两个波兰语字母的名字(ń
和 ó
),如下所示:
- piaseczyński
- 齐洛诺戈尔斯基
当然这些名字不止两个
第一个应该看起来像 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')
请注意,这仍然会以两种方式失败:
- 如果您得到一个采用某种非 UTF-8 编码的字符串,而该字符串恰好也可以解码为 UTF-8。
- 如果您得到的字符串不是 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
。
从其他来源我得到两个带有两个波兰语字母的名字(ń
和 ó
),如下所示:
- piaseczyński
- 齐洛诺戈尔斯基
当然这些名字不止两个
第一个应该看起来像 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')
请注意,这仍然会以两种方式失败:
- 如果您得到一个采用某种非 UTF-8 编码的字符串,而该字符串恰好也可以解码为 UTF-8。
- 如果您得到的字符串不是 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
。