如何解决PHP字符串重音字符更改
我正在使用elfinder作为PHP连接器(elFinder Documentation)的文件浏览器,已经为Sanitizer插件(Sanitizer plugin)配置了回调功能。
function sanitize($filename){ // Or @callable sanitize function
$a = pathinfo($filename);
$b = strtourl($a['filename'],false).'.'.$a['extension'];
echo $b;
return $b;
}
function strtourl($str,$toLower = true){
$sr = array('À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö','Ø','Ù','Ú','Û','Ü','Ý','ß','à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ñ','ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','ÿ','Ā','ā','Ă','ă','Ą','ą','Ć','ć','Ĉ','ĉ','Ċ','ċ','Č','č','Ď','ď','Đ','đ','Ē','ē','Ĕ','ĕ','Ė','ė','Ę','ę','Ě','ě','Ĝ','ĝ','Ğ','ğ','Ġ','ġ','Ģ','ģ','Ĥ','ĥ','Ħ','ħ','Ĩ','ĩ','Ī','ī','Ĭ','ĭ','Į','į','İ','ı','IJ','ij','Ĵ','ĵ','Ķ','ķ','Ĺ','ĺ','Ļ','ļ','Ľ','ľ','Ŀ','ŀ','Ł','ł','Ń','ń','Ņ','ņ','Ň','ň','ʼn','Ō','ō','Ŏ','ŏ','Ő','ő','Œ','œ','Ŕ','ŕ','Ŗ','ŗ','Ř','ř','Ś','ś','Ŝ','ŝ','Ş','ş','Š','š','Ţ','ţ','Ť','ť','Ŧ','ŧ','Ũ','ũ','Ū','ū','Ŭ','ŭ','Ů','ů','Ű','ű','Ų','ų','Ŵ','ŵ','Ŷ','ŷ','Ÿ','Ź','ź','Ż','ż','Ž','ž','ſ','ƒ','Ơ','ơ','Ư','ư','Ǎ','ǎ','Ǐ','ǐ','Ǒ','ǒ','Ǔ','ǔ','Ǖ','ǖ','Ǘ','ǘ','Ǚ','ǚ','Ǜ','ǜ','Ǻ','ǻ','Ǽ','ǽ','Ǿ','ǿ');
$rp = array('A','A','AE','C','E','I','D','N','O','U','Y','s','a','ae','c','e','i','n','o','u','y','d','G','g','H','h','IJ','ij','J','j','K','k','L','l','OE','oe','R','r','S','T','t','W','w','Z','z','f','o');
$url = $str;
if($toLower) $url = strtolower($url);
$url = preg_replace('/\s+/',"-",$url);
$url = str_replace($sr,$rp,$url);
$url = preg_replace('/[^a-zA-Z0-9_.-]+/i',$url);
$url = preg_replace('/-{2,}/',$url);
$url = preg_replace('/-+$/',"",$url);
return $url;
}
如果我使用自定义字符串手动调用此函数,则效果很好。如果我在插件调用时用自定义字符串替换$ filename,则效果很好。
但是,当任何函数触摸字符串时,都会修改来自插件的文件名。让我解释一下。
插件-> sanitize(“CamiónAvión.jpg”)
如果我注释所有内容并回显$ filename,则输出为预期的Camión Avión.jpg
,但是如果我取消注释所有内容并在函数开始时回显$ filename,则输出为CamioÌn AvioÌn.jpg
,但是在回显$ filename之前,什么也没做。
如果我删除自定义函数strtourl()并尝试下一个,那么我们可以做得更多:
function Sanitize($filename){
var_dump($filename);
var_dump($filename{5});
var_dump($filename{6});
var_dump($filename{7});
}
结果是:
string(20) "CamioÌn AvioÌn.jpg"
string(1) "Ì"
string(1) ""
string(1) "n"
在ascii UTF-8中,“Ì”是204,而“” 129是代码。
如果我评论以下3行:
function Sanitize($filename){
var_dump($filename);
//var_dump($filename{5});
//var_dump($filename{6});
//var_dump($filename{7});
}
结果是:string(20) "Camión Avión.jpg"
我不知道会发生什么,有人可以帮我吗?。
谢谢。
解决方法
最后,正如@JosefZ所说,这是一个规范化问题。 elFinder连接器提供了一个插件,也可以在清除文件名之前对其进行标准化处理。 Normalizer Plugin
这是我的最终配置:
$opts = array(
'bind' => array(
'upload.pre mkdir.pre mkfile.pre rename.pre archive.pre ls.pre' => array(
'Plugin.Normalizer.cmdPreprocess','Plugin.Sanitizer.cmdPreprocess'
),'upload.presave paste.copyfrom' => array(
'Plugin.Normalizer.onUpLoadPreSave','Plugin.Sanitizer.onUpLoadPreSave'
)
),'roots' => array(
array(
'driver' => 'LocalFileSystem','path' => ROOT_PATH,'URL' => URI.ROOT,"trashHash" => "t2_Lw",'alias' => $_ENV['WEBID'],'attributes' => $attrs,'plugin' => array(
'Normalizer' => array(
'enable' => true,'nfc' => true,'nfkc' => true,'umlauts' => false,'lowercase' => false,'convmap' => array()
),'Sanitizer' => array(
'enable' => true,'targets' => array('\\','/',':','','?','"','<','>','|'),// target chars
'replace' => '_',// replace to this
'callBack' => '\App\Admin\Controllers\Sanitize'
)
)
),array(
'id' => '2','driver' => 'Trash','path' => ROOT_PATH . '/.papelera',)
),'maxTargets' => string2bool($_POST['multiple']) ? null : 1,'debug' => DEBUG,'locale' => 'es_ES.UTF-8','tmbBgColor' => '#FFFFFF','tmbCrop' => false
);
使用此elFinder连接器选项和以前的功能(strtourl和清理回调),可以按预期工作。
请注意,Normalizer插件使用需要国际扩展名的PHP Normalizer类。我在Mac的Xampp上安装它时遇到了一些麻烦,但是我发现了解决该问题的文章。 Intl for Xammp on mac
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。