如何对含非ASCII字符的文件路径计算md5校验值以避免UnicodeEncodeError
问题原因
hashlib.md5() 方法仅接受字节类型(bytes)的输入参数,传入字符串类型的路径时,Python会默认使用ASCII编码做隐式转换,当路径包含超出ASCII范围的字符时,就会触发UnicodeEncodeError报错。
仅过滤ASCII路径的临时方案会舍弃所有含非ASCII字符的合法路径,存在明显的功能缺陷。
最优解决方案
主动指定通用编码(统一使用UTF-8即可,兼容所有Unicode字符,跨环境一致性好)将路径字符串显式转换为字节后再传入md5方法即可,无需过滤路径。
Python 3 示例代码
{hashlib.md5(path.encode('utf-8')).hexdigest() for path in paths}
Python 2 兼容写法
如果运行环境为Python2,路径为unicode类型,写法如下:
{hashlib.md5(path.encode('utf-8')).hexdigest() for path in paths}
注意事项
如果业务场景有特殊的路径编码要求(比如部分老Windows系统路径使用GBK编码),只需把上述代码中的utf-8替换为对应编码即可,只要计算MD5的编码规则前后统一,就不会出现同一个路径计算出不同哈希值的问题。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

