python - 波兰语字母的字符编码和解码处理方式不同
问题描述
从其他来源我得到两个带有两个波兰字母(ń
和ó
)的名字,如下所示:
- 皮亚塞奇滑雪
- 济隆诺戈尔斯基
当然,这些名字不止两个。
第一个应该看起来像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
为什么波兰字母不被同等对待?如何解决?
解决方案
您可能已经意识到,这些字符串具有不同的编码。最好的方法是在源头修复它,以便它始终返回 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。
- 如果你得到一个非 UTF-8 编码的字符串,它不是 Windows 代码页 1252。欧洲另一个常见的编码是 ISO-8859-1 (Latin-1)。在一个中有效的每个字节串在另一个中也有效。
如果您确实需要处理多种不同的非 UTF-8 编码并且您知道它应该是波兰语,您可以计算每个可能的解码中非 ASCII 波兰语字母的数量,并返回得分最高的那个。仍然不是万无一失的,所以说真的,最好从源头上修复它。
推荐阅读
- laravel - 如何从 YAML 文件中调用 laravel 变量?
- url-rewriting - EspoCRM 报错 可能的问题:禁用 URL Rewrite
- python - 请求令牌时,Google API 刷新令牌为无
- jupyter-notebook - 为什么我的 jupyterlab 会自行自动重启(远程服务器)?
- python - 由于缺少必需的位置参数:'application',DispatcherMiddleware 不适用于 gunicorn,但如何指定?
- oracle - 如何在 oracle 中更新 ref 游标值?
- c++ - Visual Studio - 缓冲区溢出
- java - SpringBoot:为测试配置 Spring DataSource
- r - 将“101.txt”因子转换为 R 中的数字
- amazon-web-services - 使用替换获取登录密码构建失败