Php 服务器迁移后图像文件名中的特殊字符编码

Php 服务器迁移后图像文件名中的特殊字符编码,php,wordpress,encoding,Php,Wordpress,Encoding,我已经将WordPress网站从Hostgator共享主机迁移到Ubuntu数字海洋灯堆栈 问题开始于我导出具有特殊字符的图像文件,例如文件 operários_tarsila-1024x640.jpg 当WordPress试图访问该文件时,它会显示一个错误。我找到了原因: 我可以通过Wordpress试图调用的Inspect元素看到:服务器返回404错误 但是,如果我在浏览器中键入此URL,则会显示图像 因此,从%C3%A1(字符)到a+%CC%81(组合accute重音)的编码之间的这种差异

我已经将WordPress网站从Hostgator共享主机迁移到Ubuntu数字海洋灯堆栈

问题开始于我导出具有特殊字符的图像文件,例如文件
operários_tarsila-1024x640.jpg

当WordPress试图访问该文件时,它会显示一个错误。我找到了原因:

我可以通过Wordpress试图调用的Inspect元素看到:服务器返回404错误

但是,如果我在浏览器中键入此URL,则会显示图像

因此,从
%C3%A1
字符)到
a
+
%CC%81
(组合accute重音)的
编码之间的这种差异似乎是导致WordPress不显示我的图像的原因

因此,现在我的服务器中有数千个重音图像文件名,其结构为
字符
+
结合重音
和WordPress调用具有结构
重音字符
的图像文件名


有没有一种方法可以让bash用一个comparison表来重命名它们?还是一种让Apache意识到这些差异并在出现这种混淆时指向正确文件的方法?

您是否尝试过在PHP脚本、Mysql和HTML中设置相同的编码

PHP:

Mysql:

HTML:

这个问题看起来像所有这些语言之间的字符集一致性问题

如果这不起作用,您必须使用一个小脚本来重命名所有图片,使用如下函数:

function wd_remove_accents($str, $charset='utf-8')
{
    $str = htmlentities($str, ENT_NOQUOTES, $charset);

    $str = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
    $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. 'œ'
    $str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères

    return $str;
}

来源:

显然,问题在于如何在新服务器上解压缩备份

有两种方法可以解决此问题:

  • 以不带重音符号的名称手动重命名文件,然后修改数据库并更改数据库中的文件名(这种情况很危险,最好备份数据库)

  • 使用Filezilla上载文件,但将其设置为强制使用UTF-8中的字符集编码


  • 文件>站点管理器>{YOUR Site}>Tab Charset>Force UTF-8

    所以,我想谈谈这个问题和一个适合我的解决方案。。。我还迁移了Wordpress站点,发现所有文件名中带有特殊字符的图像在迁移后都会生成404

    最后,我不得不通过phpMyAdmin手动重命名和编辑数据库。这是一项艰巨的任务,我绝对建议您首先备份数据库

    在我的例子中,我有大量的媒体附件,它们的文件名中使用了特殊字符

    首先,我通过删除字符在本地重命名了文件。我用过。只是找到了文件名,并将其替换为零(甚至没有空格)。然后,我从
    /wp content/uploads/
    文件夹中删除了所有旧文件,并将它们替换为新文件

    接下来,我进入数据库更新表值。媒体附件的信息存储在
    wp_posts
    wp_postmeta
    表中。下面是我运行以更新两者的SQL-

    update wp_posts set guid = replace(guid,'©','');
    
    UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, '©', '') 
    WHERE LOWER(RIGHT(meta_value, 5)) = '.jpeg' OR 
    LOWER(RIGHT(meta_value, 4)) IN ('.jpg', '.gif', '.png')
    
    同样,我们用一个空格来代替这个角色

    为了更新所有的缩略图和各种附件大小,我不得不使用,但这样做了


    我真的很感谢大家在这篇文章上的努力,并帮助我解决这个问题!希望这对别人有帮助

    我们刚刚在wordpress部署中遇到了类似的法语字符问题,我们的解决方案是使用FileZilla从PC上传文件,而不是从Mac上传FileZilla

    当我从mac OSX上传到CentOS服务器时,仅当以a+%CC%81格式调用时,文件才会显示


    当我从PC上传文件时,apache发现这些文件是%C3%A1格式的,这就是wordpress对它们进行编码的方式。

    我们也有同样的问题-Mac+FileZilla+SK语言中的特殊字符

    使用另一个FTP客户端(在我们的例子中是Cyberduck)修复了问题。


    FileZilla文件名编码似乎有问题。强制utf8编码(FileZilla主机设置)没有帮助。

    如果您有WP\u CLI运行此脚本。您必须更改
    wp\uwp
    表格前缀。 它只修改非FORM_D格式的文件名。 备份数据库以防出现问题

    #!/bin/bash
    normalizeWP_PHP_Script=$'
        global $wpdb;
        $rows = $wpdb->get_results( "SELECT * FROM wp_postmeta where meta_key='"'"'_wp_attached_file'"'"'");
        foreach ( $rows as $row ) 
        {
            $postId = $row->{'"'"'post_id'"'"'};
            $filePath = $row->{'"'"'meta_value'"'"'};
            if( ! normalizer_is_normalized($filePath, Normalizer::FORM_D) ){
                $filename_nfd = Normalizer::normalize($filePath, Normalizer::FORM_D);
                echo $filename_nfd." | ";
                $wpdb->query($wpdb->prepare("UPDATE wp_postmeta SET meta_value='"'"'$filename_nfd'"'"' WHERE post_id=$postId"));
            }
        }';
        wp eval "$normalizeWP_PHP_Script"
        echo " - Uploads-url nomalized --nfd"
    

    对于这种情况,有一个插件。
    您可以查看

    ,使用filezile的技巧可以在包含图像的zip文件上工作?我用cpanel的文件管理器压缩了一个文件夹,然后我上传到了新服务器,我也遇到了同样的问题。太棒了!我仍然感到惊讶,为什么Filezilla并没有单独处理encondig。自动模式似乎不起作用:(非常感谢@alose!虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效。