对于带有 utf-8 阿拉伯语字符集字符串的文件名,PHP 重命名失败


PHP rename failed for filename with utf-8 arabic charset string

>我对 php 重命名函数有问题,如果文件名是带空格的阿拉伯语单词,它会失败。

例如

rename(temp/أم كلثوم       ثوار - ثوار.mp3,audio/13408831061.mp3);

(路径)中没有此类文件或目录

请注意:أم كلثومxxxxxxxxثوار - ثوار.mp3

这里至少有六个空格xxxxxxx

我试了urlencode()但仍然没有结果。

任何建议!

此示例应该有所帮助,我测试了下面的代码,它可以在 Windows 中为阿拉伯语/波斯语名称工作:

$newname  = $filename = iconv("utf-8", "cp1256","گچپژ");
echo rename("1.txt", $newname);

要检查您的$file_id是否正确,请在类 Unix 系统上执行此操作:

echo "<pre>'n"; // for HTML output only
system("echo -n '$file_id' | od -tx1");

使用此值,它应该是您报告的文件名(您可以执行echo进行检查)

$file_id = "'xD9'x83'xD9'x84'xD8'xAB'xD9'x88'xD9'x85 'xD8'xAB'xD9'x88'xD8'xA7'xD8'xB1 - 'xD8'xAB'xD9'x88'xD8'xA7'xD8'xB1.mp3";

输出为

0000000 d9 83 d9 84 d8 ab d9 88 d9 85 20 d8 ab d9 88 d8
0000020 a7 d8 b1 20 2d 20 d8 ab d9 88 d8 a7 d8 b1 2e 6d
0000040 70 33
0000042

(如您所见,以 B1 结尾的序列会自行重复,最后 4 个字节是.mp3

在文件应该所在的目录中,您可以发出

ls -1 | od -tx1

您将看到所有文件名由换行符分隔0a

如果两个输出都匹配,则问题出在 PHP 或系统中的某个地方(两者都不太可能),如果不匹配,您将不得不从编码开始追逐代码中的问题,编码必须在任何地方都是 UTF-8。