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


Special characters encoding in image filenames after server migration

我已经将一个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意识到这些差异,并在发生这种混淆时指向正确的文件?

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

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

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

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

File> Site Manager> {YOUR Site}> Tab字符集>强制UTF-8

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

问题修复使用另一个FTP客户端(Cyberduck在我们的情况下)。

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

所以,只是触及这个问题和一个解决方案,为我工作…我也迁移了一个Wordpress网站,发现所有文件名中有特殊字符的图片在迁移后都会产生404。

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

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

首先,我通过删除字符在本地重命名文件。我用了1-4a重命名。只是找到文件名并将其替换为空(甚至没有空格)。然后,我从/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插件再生缩略图来更新所有缩略图+各种附件大小,但这确实奏效了。

我真的很感谢每个人在这篇文章和这篇文章上的努力,帮助我弄清楚!希望这对大家有所帮助!

您是否尝试在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. '&oelig;'
    $str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
    return $str;
}

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

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

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

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

如果您有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"

有一个插件可以处理这种情况。你可以选择媒体文件重命名器