web-dev-qa-db-fra.com

problème d'encodage de nom de fichier

Je reçois un fichier avec un nom faroese et j'essaie de le sauvegarder dans un script PHP:

2010_08_Útflutningur.xls

Dans Ubuntu 10.04, LTS l’enregistre en tant que:

2010_08_�tflutningur.xls (invalid encoding)

J'ai installé et exécuté utf8-migration-tool, mais sans effet.

Est-ce une erreur Ubuntu que je peux réparer ou je dois juste abandonner et modifier le nom en php?

Existe-t-il un document indiquant quel est le jeu de caractères acceptable pour un nom de fichier dans Ubuntu ou quelles sont les spécifications d'encodage?

Merci

9
Elzo Valugi

Cela ressemble à un problème d'encodage. Malheureusement, PHP a besoin d'un peu de main de main en matière d'encodage, car ses chaînes sont codées sur un octet par défaut. Si vous créez le nom de fichier dans PHP, utf8_encode() devrait être utile; notez cependant que cela suppose un codage ISO-8859-1 pour l'entrée.

D'autre part, si vous utilisez le nom de fichier soumis par un client, vous pouvez peut-être demander au client de procéder à l'encodage pour vous. Cela est fait avec l'attribut accept-charset de la balise _<form>_ et/ou en définissant le jeu de caractères de la page sur laquelle se trouve le formulaire. Certains clients peuvent utiliser l’un ou l’autre. Pour obtenir les meilleurs résultats, utilisez UTF-8.

5
eswald

Par défaut, Ubuntu utilise UTF-8 pour les noms de fichiers. La plupart des distributions linux modernes et de nombreux autres systèmes d'exploitation le font (Windows/NTFS est l'exception la plus connue avec UTF-16).

Pour réparer les fichiers dont le nom est dans le mauvais codage, comme celui que vous affichez, vous pouvez utiliser nautilus-filename-repairer

Sudo apt-get install nautilus-filename-repairer

Vous pouvez utiliser les fonctions PHP iconv pour convertir des chaînes (noms de fichiers) d'un encodage à l'autre. Bien sûr, cela nécessite que vous sachiez dans quel encodage ils se trouvent.

Pour obtenir des noms de fichiers correctement encodés à partir du client, vous pouvez essayer la technique décrite par eswald.

7
JanC