我们当前的系统会保存与其父组名称相匹配的文件。因此,名为“我的设备”的组保存了一个名为“My + Devices.jpg”的图像。这很好用,即使在PHP和JS的某个地方将名称转换为“My%20Devices.jpg”时出现了一些问题,我还是可以在发生这种情况之前将空格转换为加号。
现在我们需要考虑其他特殊字符,例如撇号,以便将一个组命名为“Joe's Devices”。我需要一些方法将其转换为可以是文件名的东西。但我不能只删除特殊字符,如果有人使用组名“Joes Devices”(没有撇号),可能会发生碰撞。
我尝试过urlencode()和rawurlencode(),但是那些使用百分号,这对于URL很有用,但对于文件名却没有那么多。我认为base64_encode()会更好,即使它是一个更长的字符串。但它包括对文件名无益的等号。
有没有办法将字符串转换为文件名友好的字符串,可以将其解码回原始字符串?或者我是否需要完全重新编码此功能并使用ID匹配?
答案 0 :(得分:2)
您的任务与创建url-safe base64编码字符串的问题非常类似。
请参阅此答案以获取一个示例:https://stackoverflow.com/a/5835352/660694
我的解决方案将是此变体。
在我的一个应用程序中,我有这个包装函数:
function base64_safe_encode($input, $stripPadding = false)
{
$encoded = strtr(base64_encode($input), '+/=', '-_~');
return ($stripPadding) ? str_replace("~","",$encoded) : $encoded;
}
现在,您可以生成易于反转的文件名或url safe base64编码字符串。
请注意,如果您愿意,可以选择在字符串末尾删除填充,PHP在解码时不需要填充字符。
解码功能非常简单:
function base64_safe_decode($input)
{
return base64_decode(strtr($input, '-_~', '+/='));
}
答案 1 :(得分:1)
假设您有一个名为“我的设备”的群组。然后使用md5对其名称进行哈希处理,以将其保存在数据库或其他内容中:
$group = 'My Device';
$filename = md5($group) . '.png';
要显示或使用它,您只需在任意位置再次散列组名称:
<?php
$group = 'My Device';
$filename = md5($group) . '.png';
?>
<img src="<?php print $filename; ?>" />