10 votes

Comment coder les noms de fichiers multi-octets en PHP et les décoder en javascript ?

Voici quelques exemples de noms de fichiers :

.jpg (Chinese)
.jpg (Russian)
AbÇöiÜ.jpg (Turkish, ISO-8859-9)
...

J'ai essayé rawurlencode(mb_convert_encoding($file, "UTF-8", mb_detect_encoding($file))) mais cela ne fonctionne pas, tous les caractères chinois et russes s'impriment comme %3F (point d'interrogation ordinaire) et tous les caractères turcs sont supprimés.

Je teste sous Windows, avec PHP 5.3.

La seule solution que j'ai trouvée est d'entrer l'encodage explicitement : rawurlencode(mb_convert_encoding($file, "UTF-8", "ISO-8859-9")) Cela ne fonctionne que pour les caractères turcs.

Au fait, mb_detect_encoding($file) renvoie toujours "UTF-8" pour les fichiers ci-dessus.

EDIT :
Après avoir exécuté le code suivant, je pense que mb_convert_encoding() ne peut pas résoudre mon problème :

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("mp", FilesystemIterator::UNIX_PATHS));
$iterator = new RegexIterator($iterator, '/^.+\.(gif|jpg|jpeg|png)$/i', RegexIterator::GET_MATCH);

foreach ($iterator as $file)
{
    foreach (mb_list_encodings() as $encoding)
        var_dump(rawurlencode(mb_convert_encoding($file[0], "UTF-8", $encoding)) . " : " . $encoding);
}

Je suppose que c'est une question d'encodage, mais je ne sais pas comment faire.

1voto

Colin Godsey Points 728

L'essentiel est donc que la plupart des transports (réseau, fichiers, rpc) utilisent des caractères d'un octet au maximum. L'encodage URL (%FF) s'attend à ce que les données d'entrée soient également d'un octet par caractère.

Ce que vous devez faire, c'est utiliser UTF8. Il prendra des caractères de plusieurs octets et en fera une chaîne de caractères d'un octet. À partir de cette chaîne, vous pouvez faire des choses que l'ascii pourrait normalement faire.

Ce que vous voulez faire, c'est définir explicitement l'encodage pour php :

mb_internal_encoding("UTF-8");

Maintenant, toutes vos chaînes internes et noms de fichiers, etc. seront encodés en UTF-8 (un seul octet). À partir de là, vous pouvez envoyer le nom de fichier tel quel et il sera transmis au transport sous forme de données codées. En javascript, tout ce que vous avez à faire est d'envoyer une requête en utilisant AJAX, et tout sera décodé pour vous automatiquement, prêt à être utilisé dans le navigateur :) Veillez simplement à définir votre content-type dans votre fichier html, car il sera utilisé comme encodage JS par défaut.

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X