2009-06-10 10 views
7

Par exemple, j'ai un nom de fichier comme celui-ci - проба.xml et je suis incapable de l'ouvrir à partir du script PHP.Comment ouvrir un fichier dans PHP qui a des caractères Unicode dans son nom?

Si script que je configuration php pour être en utf-8 que tout le texte dans le script est utf-8 ainsi quand je passe cela file_get_contents:

$fname = "проба.xml"; 
file_get_contents($fname); 

J'obtiens l'erreur ce fichier n'existe pas. La raison en est que sous Windows (XP) tous les noms de fichiers avec des caractères non latins sont unicode (UTF-16). OK alors j'ai essayé ceci:

$fname = "проба.xml"; 
$res = mb_convert_encoding($fname,'UTF-8','UTF-16'); 
file_get_contents($res); 

Mais l'erreur persiste depuis file_get_contents ne peut pas accepter des chaînes unicode ...

Toutes les suggestions?

+0

Ce code est-il à jour? Vous n'avez pas changé $ fname avec $ res dans file_get_contents, ou est-ce juste une faute de frappe? – ryanday

+0

Ceci est ma faute de frappe. J'ai effectivement changé les valeurs. –

+0

Je suis arrivé à mon système XP et j'ai essayé votre code. J'ai sauvé le fichier PHP en Unicode, et copié/collé ce que vous avez écrit et je peux lire le fichier (même nom de fichier). Quel est le codage de votre fichier source enregistré? – ryanday

Répondre

0

Ce sont des conclusions à ce jour:

  1. PHP 5 ne peut pas le nom de fichier ouvert avec des caractères unicode à moins que le nom de fichier source est unicode.
  2. PHP 5 (au moins sur Windows XP) n'est pas capable de traiter la source PHP en Unicode.

Ainsi, la conclusion cela ne faisables en PHP 5.

+0

PHP peut ouvrir un nom de fichier avec des caractères non-ASCII seulement si tous les caractères sont dans la page de code par défaut de l'installation de Windows. Il peut traiter des littéraux de chaîne contenant des caractères non-ASCII; il utilise simplement les octets directs, donc cela dépend de l'encodage dans lequel vous avez sauvegardé le fichier source, dans votre éditeur de texte. L'encodage que de nombreux éditeurs de texte Windows appellent "Unicode" est en fait UTF-16LE, ce qui, étant non compatible ASCII, ne peut pas être traité par PHP. Voir [cette question] (http://stackoverflow.com/q/482342/18936) pour le fond. – bobince

0

Vous pouvez essayer:

  • obtenir la chaîne pour le nom du fichier à partir d'un répertoire liste en utilisant opendir et readdir
  • passant cette chaîne à file_get _contents pour voir si cela fonctionnera, ou
  • essayer d'obtenir le contenu du fichier en utilisant fopen, fread et fclose

Espérons que cela aide!

+0

Pourriez-vous inclure des exemples de code pour montrer comment cela fonctionnerait? –

8

MISE À JOUR (13 Juillet '17)

Bien que les documents ne semblent pas en parler, PHP 7.0 et ci-dessus prend en charge Unicode enfin les noms de fichiers sur Windows hors de la boîte. Les API du système de fichiers de PHP acceptent et retournent les noms de fichiers selon default_charset, qui est UTF-8 par défaut.

Se reporter à la correction d'un bug ici: https://github.com/php/php-src/commit/3d3f11ede4cc7c83d64cc5edaae7c29ce9c6986f


MISE À JOUR (29 janvier '15)

Si vous avez accès au répertoire des extensions PHP, vous pouvez essayer d'installer php-wfio.dll à https://github.com/kenjiuno/php-wfio, et reportez-vous à fichiers via le protocole wfio://.

file_get_contents("wfio://你好.xml"); 

Réponse originale

PHP sur Windows utilise l'héritage de "API ANSI" exclusivement pour l'accès aux fichiers local, ce qui signifie que PHP utilise les paramètres régionaux système au lieu d'Unicode.

Pour accéder aux fichiers dont le nom de fichier contient Unicode, vous devez convertir le nom de fichier au codage spécifié pour les paramètres régionaux système en cours. Si le nom de fichier contient des caractères qui ne sont pas représentables dans l'encodage spécifié, vous n'avez pas de chance(Mise à jour: voir la section ci-dessus pour une solution). scandir renverra le charabia pour ces fichiers et passera la chaîne en fopen et les équivalents échoueront.

trouver le bon codage à utiliser, vous pouvez obtenir les paramètres régionaux du système en appelant <?=setlocale(LC_TYPE,0)?>, et en regardant le code Identification Page (le nombre après la .) au MSDN article https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx. Par exemple, si la fonction renvoie Chinese (Traditional)_HKG.950, cela signifie que la page de codes 950 est utilisée et que le nom de fichier doit être converti en encodage big-5. Dans ce cas, votre code devra être comme suit, si votre fichier est enregistré en UTF-8 (de préférence sans BOM):

$fname = iconv('UTF-8','big-5',"你好.xml"); 
file_get_contents($fname); 

ou comme suit si vous enregistrez directement le fichier en tant que Big-5:

$fname = "你好.xml"; 
file_get_contents($fname); 
+0

Merci pour cette mise à jour. –

+0

Salut, Pouvez-vous me dire comment extraire le fichier .zip, qui contient le nom des fichiers est UTF-8 –

Questions connexes