使用 PHP 重命名包含特殊字符的文件夹

Rename folder which contains special characters using PHP

提问人:Andrew 提问时间:12/2/2022 最后编辑:Andrew 更新时间:12/2/2022 访问量:50

问:

我的数据库和目录中都有以下名称。

Zúñnga
Mariè
etc...

问题是我试图这样做:

$oldname = '/home/website/public_html/profile/Zúñnga';
$newname = '/home/website/public_html/profile/Zuunga';

rename($oldname, $newname)

而且它不起作用......

这些名称存储在数据库中。

这是我一直用来从数据库中获取名称的以下脚本,将它们转换为 UTF-8,但只是重命名功能不起作用......

...
foreach($query as $item)
{
    $name_tags = utf8_encode($item['name_tags']);

    $oldname = '/home/website/public_html/profile/'.$name_tags.'';

    $text = iconv('UTF-8','ASCII//TRANSLIT', $name_tags);
    $text_1 = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $text);
    $text_2 =  preg_replace("/[^A-Za-z0-9- ]/", '', $text_1);
    $name_tags_updated =  str_replace(" ", "-", $text_2);


        $newname = '/home/website/public_html/profile/'.$name_tags_updated.'';
        rename($oldname, $newname)

        $sql = 'UPDATE posts SET name_tags = "'.$name_tags_updated.'" where id = "'.$item['id'].'";
        ...
}

查询部分工作正常;它用数据库中的好字母替换名称,但是当涉及到重命名目录时,它根本不起作用。它没有将名称更改为实际文件,而是没有。我试图以这种方式验证它

if(rename($oldname, $newname))
        echo 'success';
    else
        echo 'fail';

它返回失败

在我的网站上,有时它们会像这样返回:

Mari�
PHP 的 HTML UTF-8

评论

0赞 user3783243 12/2/2022
你不应该这样编写 SQL,也不应该这样存储用户输入。如果列出系统上的内容,字符是否相同?我发现 mac 和 linux 的存储系统不同,带有重音字符。因此,来自 mac 的键盘在 linux 系统上不匹配。Linux 使用单码位,而 mac 使用双码位。unix.stackexchange.com/questions/494883/......也许使用通配符可以工作éé
0赞 Sammitch 12/2/2022
首先,你需要知道你的文件系统正在使用什么字符集,否则我们只是推测。使用类似的东西列出目录内容,并将其转换为可以安全地复制/粘贴到 SO 的表示形式。了解您的操作系统和文件系统类型也很有用。glob()bin2hex()
1赞 Sammitch 12/2/2022
此外,和是应该避免的可怕功能。它们只会在 UTF-8 和 ISO-8859-1 之间转换,如果使用不当,它们会愉快地损坏您的数据,并且永远不会正确使用utf8_encode()utf8_decode()
1赞 Peter Mortensen 12/2/2022
你能比“它不起作用”更具体吗?会发生什么(或没有发生)?有哪些症状?请通过编辑(更改)您的问题来回答,而不是在评论中(***************没有***************“编辑:”,“更新:”或类似内容 - 问题应该看起来好像是今天写的)。

答: 暂无答案