【问题标题】:Special characters encoding in image filenames after server migration服务器迁移后图像文件名中的特殊字符编码
【发布时间】:2015-10-25 03:07:55
【问题描述】:

我已将 WordPress 网站从 Hostgator 共享主机迁移到 Ubuntu Digital Ocean LAMP 堆栈。

当我导出包含特殊字符的图像文件时,问题就开始了,例如文件 operários_tarsila-1024x640.jpg.

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

我可以通过 Inspect Element 看到 Wordpress 尝试调用:http://mywebsite.com/wp-content/uploads/2013/02/oper%C3%A1rios_tarsila-1024x640.jpg 并且服务器返回 404 错误。

但是,如果我在浏览器中输入此 URL:http://mywebsite.com/wp-content/uploads/2013/02/opera%CC%81rios_tarsila-1024x640.jpg 它可以工作并显示图像。

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

所以现在我的服务器中有数千个重音图像文件名,结构为 character+ combining accent,而 WordPress 调用结构为 accented character 的图像文件名。

有没有办法 bash 用比较表重命名它们?或者是一种让 Apache 了解这些差异并在发生这种混淆时指向正确文件的方法?

【问题讨论】:

    标签: php wordpress encoding


    【解决方案1】:

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

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

    1. 手动重命名文件,不带重音的名称,然后修改数据库,更改数据库中的文件名(这个maluco可能很危险,最好备份数据库)。

    2. 使用 Filezilla 上传文件,但将其设置为强制使用 UTF-8 字符集编码。

    File> Site Manager> {YOUR SITE}> Tab Charset> Force UTF-8

    【讨论】:

    • 而使用 filezile 的技巧适用于包含图像的 zip 文件?我使用 cpanel 的文件管理器压缩一个文件夹,然后我上传到新服务器,我遇到了同样的问题。
    • 太棒了!为什么 Filezilla 不自己处理 encondig 仍然让我感到惊讶。自动模式似乎不起作用:(非常感谢@Alorse!
    【解决方案2】:

    所以,只是谈谈这个问题和一个对我有用的解决方案......我还迁移了一个 Wordpress 网站,发现文件名中包含特殊字符的所有图像在迁移后都会产生 404。

    我最终不得不通过 phpMyAdmin 对数据库进行手动文件重命名和编辑。这很费力,我绝对建议先备份您的数据库。

    就我而言,我有大量在文件名中使用特殊字符 © 的媒体附件。

    首先,我通过删除字符在本地重命名文件。我用1-4a rename。刚刚找到文件名并将其替换为任何内容(甚至没有空格)。然后,我从/wp-content/uploads/ 文件夹中删除了所有旧文件,并用新文件替换了它们。

    接下来,我进入我的数据库以更新表值。媒体附件的信息存储在wp_postswp_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')
    

    再一次,我们将字符替换为什么都没有,甚至没有空格。

    我必须使用 WP plugin Regenerate Thumbnails 来更新所有缩略图 + 各种附件大小,但这成功了。

    我非常感谢大家在这篇文章上的努力和this post 帮助我解决这个问题!希望这对某人有帮助!

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        PHP : http://php.net/manual/en/function.mb-internal-encoding.php

        Mysql:http://php.net/manual/en/function.mysql-set-charset.php

        HTML : <meta http-equiv="content-type" content="text/html; charset=utf-8" />

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

        如果这不起作用,您将不得不使用一个小脚本来重命名所有图片,使用如下功能:

        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;
        }
        

        来源:http://www.weirdog.com/blog/php/supprimer-les-accents-des-caracteres-accentues.html

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            如果你有 WP_CLI 运行这个 BashScript。您必须更改 wp_ 表前缀。 它只修改不是 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"
            

            【讨论】:

              【解决方案7】:

              有一个针对这种情况的插件。 您可以查看Media File Renamer

              【讨论】:

              • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 link-only-answers
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-08
              • 2012-11-25
              • 2014-12-21
              相关资源
              最近更新 更多