微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP字符串重音字符更改

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?