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);
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
Ceci est ma faute de frappe. J'ai effectivement changé les valeurs. –
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