El cambio de nombre de PHP falló para el nombre del archivo con una cadena de caracteres arabic utf-8

Tengo un problema con la función de cambio de nombre de php, falla si el nombre del archivo está en palabras en árabe con espacios.

p.ej

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

No hay tal archivo o directorio en (ruta)

tenga en cuenta: أم كلثومxxxxxxxxثوار - ثوار.mp3

xxxxxxx aquí al menos seis espacios.

Intenté urlencode() pero todavía no hay resultados.

¡Cualquier sugerencia!

    Para verificar que tu $file_id sea ​​correcto, hazlo en un sistema tipo Unix:

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

    Con este valor, que debería ser su nombre de archivo informado (puede hacer un echo para verificar)

     $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"; 

    la salida es

     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 

    (Como puede ver, la secuencia que termina con un B1 repite, los últimos 4 bytes son .mp3 )

    En el directorio donde debería estar el archivo, puede emitir un

     ls -1 | od -tx1 

    y verá todos los nombres de archivos separados por 0a que son líneas nuevas.

    Si ambas salidas coinciden, el problema está en algún lugar de PHP o en el sistema (ambas poco probables); si no lo hacen, tendrán que perseguir el problema en su código, comenzando por la encoding, que debe ser UTF-8 en todas partes.

    Esta muestra debería ayudar, pruebo el código de abajo y funciona en Windows para los nombres en árabe / persa:

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