有没有办法将任意用户输入名称转换为具有可逆编码的安全文件名?
我有一些属于用户命名的实体的数据文件。当然,他们可以做些愚蠢的事情,比如在名字中放入无效的文件系统字符。
我经常看到的两个建议是:
A)Base64对它们进行编码
B)剥离非法字符
Base64是可逆的,但是对于调试/内省,当文件名看起来和名字一样时,它真的很好。只是保持一切更可调试。方法B是不可逆的,因此无论如何都必须冗余地存储“实际”名称,因此不仅仅使用uuid或其他东西也没有实际价值。
这是专门针对Linux的。虽然这不是特定于python的,但我正在实现它。
答案 0 :(得分:4)
您可以使用网址编码:
from urllib.parse import quote
safefilename = quote(filename, safe='')
这是完全可以绕过的,并且可以保持ASCII字符的可读性:
>>> from urllib.parse import quote, unquote
>>> quote('foo/../bar', safe='')
'foo%2F..%2Fbar'
>>> unquote(quote('foo/../bar', safe=''))
'foo/../bar'
将safe
设置为空字符串;默认值为'/'
,因此通常不会转义斜杠。
答案 1 :(得分:1)
您可以对用户提供的字符串进行URL编码。
根据Wikipedia article on Percent Encoding(它本身引用RFC 3986),唯一的URL安全字符是A-Z,a-z,0-9,破折号,下划线,点和波浪号(〜)。 Tilde在shell中有一个独特的解释,但它对于Linux文件名并不违法。
看起来像urllib(2)在Python中使用URL编码非常简单,但我不是Python程序员。