我编写了一个脚本来为我的尼康原始文件 (.NEF) 生成自定义缩略图。到目前为止一切顺利。现在缩略图文件名必须是 NEF 图像绝对路径的 md5,如此处所述关联。
我生成的 md5 与系统生成的不匹配,下面使用 .jpg 文件进行一些测试
path = 'file:///home/ricardo/Área de Trabalho/TempImgX/capa_site_01.jpg'
StrNoSpecial = 'file%3A%2F%2F%2Fhome%2Fricardo%2F%C3%81rea%20de%20Trabalho%2FTempImgX%2Fcapa_site_01.jpg'
print(hashlib.md5((path).encode()).hexdigest())
print(hashlib.md5((StrNoSpecial).encode()).hexdigest())
结果:
f9aa4e24d9942a1b120ecc5b7af360f9
5dd1386290a8ea7642d5864c349c28d4
缩略图文件夹中当前工作缩略图的 md5:
1f6cd39593b60e303d26856ffa471689
如您所见,哈希值不同。这里的问题出在特殊字符上吗?
答案1
文件名的正确编码似乎是:
file:///home/ricardo/%C3%81rea%20de%20Trabalho/TempImgX/capa_site_01.jpg
即:将所有空格替换为 ,%20
并将 替换Á
为%C3%81
。不要替换斜线/
和冒号:
。然后(在 bash 中):
filename="file:///home/ricardo/%C3%81rea%20de%20Trabalho/TempImgX/capa_site_01.jpg";
echo -n "$filename" | md5sum
1f6cd39593b60e303d26856ffa471689 -
作为@Rinzwind在评论中说,
不仅仅是{空格},还有
! * ' ( ) ; : @ & = + $ , / ? % # [ ]
任何不在 AZ 中的字符(例如重音符号)[需要替换。]
不幸的是,您不能将此规则应用于完整的 URI,
file:///home/ricardo/Área de Trabalho/TempImgX/capa_site_01.jpg
因为这会产生效果
file%3A%2F%2F%2Fhome%2Fricardo%2F%C3%81rea%20de%20Trabalho%2FTempImgX%2Fcapa_site_01.jpg
并且不起作用。
相反,NEF/缩略图工具的算法似乎是这样工作的:
- 将文件名(如
/home/ricardo/Área de Trabalho/TempImgX/capa_site_01.jpg
)拆分为/
几部分 - foreach 这样的部分用百分比编码替换所有奇怪的字符
- 重新连接零件
/
- 前置
file://
- 应用于
md5
结果字符串。