【发布时间】:2017-07-10 19:47:50
【问题描述】:
我有一个网络表单,您可以在其中上传文件。要替换特殊字符,我使用以下函数:
function createSafeFilenameForQuestion($filename){
$filename = str_replace(" ", "_", $filename);
$search = array("ä", "ö", "ü", "ß", "Ö", "Ä", "Ü");
$replace = array("ae","oe","ue","ss","Oe","Ae","Ue");
$ret = str_replace($search, $replace, $filename);
$in_charset = mb_detect_encoding($filename);
$ret = iconv($in_charset, 'US-ASCII//TRANSLIT', $ret);
$ret = preg_replace("/\s/i", "_", $ret);
$ret = preg_replace("/[^0-9a-z_\.]/i", "", $ret);
$filename = mb_strtolower($ret);
return $filename;
}
createSafeFilenameForQuestion("ä#`´+4`32 _.png");
我的问题是,这段代码在我的本地机器上运行良好,在 PHP 5.2.5 上运行,在服务器上运行 PHP 5.2.0。
local output: aeae432__.png
server output: ae
看来,字符´ 是问题所在。
【问题讨论】:
-
服务器是否安装了mbstring扩展?
-
mb_detect_encoding()不会按照你的想法去做。其实基本没用。此外,同时进行iconv($in_charset, 'US-ASCII//TRANSLIT', $ret);和手动替换是多余的。 /// 无论如何,我的建议是根本不关心文件的原始名称。自己分配一个,可能是一个随机的,并在下载标题上使用原始名称。