Comment puis-je utiliser les fonctions de fichiers en PHP, à l'aide des chaînes UTF-8?
Je ne peux pas utiliser mkdir
de créer des dossiers avec des caractères UTF-8:
<?php
$dir_name = "Depósito";
mkdir($dir_name);
?>
quand je navigue sur ce dossier dans l'Explorateur Windows, le nom du dossier ressemble à ceci:
Depósito
Que dois-je faire?
Je suis en php5
Vous devez vous connecter pour publier un commentaire.
Juste
urlencode
la chaîne désirée comme nom de fichier. Tous caractères renvoyés parurlencode
sont valides dans les noms de fichiers (NTFS/HFS/UNIX), alors vous pouvez simplementurldecode
le dos des noms de fichiers en UTF-8 (ou quel que soit l'encodage ils ont été dans).Mises en garde (appliquer à toutes les solutions ci-dessous):
glob
ou la réouverture d'un fichier individuel.scandir
ou des fonctions similaires pour l'alpha-tri. Vous devezurldecode
les noms de fichiers, puis d'utiliser un algorithme de tri au courant de l'UTF-8 (et les classements).Pire Des Solutions
Suivantes sont de moins en moins attractif solutions, plus compliqué et avec plus de mises en garde.
Sur Windows, le système de fichiers PHP wrapper attend et retourne ISO-8859-1 chaînes de caractères pour les noms de fichiers. Cela vous donne deux choix:
Utiliser l'UTF-8 librement dans vos noms de fichiers, mais de comprendre que des caractères non ASCII semblent incorrects en dehors de PHP. Un non-ASCII, UTF-8 char sera stocké sous la forme de multiples unique ISO-8859-1 caractères. E. g.
ó
apparaissent commeó
dans l'Explorateur Windows.Limite de votre fichier/répertoire des noms de caractères représentables en ISO-8859-1. Dans la pratique, vous allez passer votre des chaînes UTF-8 par
utf8_decode
avant de les utiliser dans les fonctions de fichiers, et de passer les entréesscandir
vous donne à traversutf8_encode
pour obtenir les noms des fichiers d'origine en UTF-8.Mises en garde à gogo!
mb_convert_encoding
au lieu deutf8_decode
.Ce cauchemar est pourquoi vous devriez probablement juste translittérer créer des noms de fichiers.
mkdir('Depósito')
créeDep%C3%B3sito
que je ne peux pas vraiment croire est ce que l'OP veut, même s'il a accepté cette réponse. Voir Umberto Salsi réponse à ce qui se passe vraiment et comment construire une bonne solution avecsetlocale()
eticonv()
.Sous Unix et Linux (et peut-être sous OS X aussi), le système de fichier de codage est donné par la
LC_CTYPE
paramètre locale (voir la fonctionsetlocale()
). Par exemple, on peut évaluer à quelque chose commeen_US.UTF-8
cela signifie que l'encodage est UTF-8. Puis les noms de fichiers et leurs chemins d'accès peuvent être créés avecfopen()
ou récupérées pardir()
avec cet encodage.Sous Windows, PHP fonctionne comme un "non-conscient Unicode programme", puis les noms de fichiers sont convertis en arrière à partir de l'UTF-16 utilisé par le système de fichiers (Windows 2000 et versions ultérieures) pour la sélection "code page". Le panneau de configuration "Options Régionales et Linguistiques", onglet "Formats" permet de définir la page de code récupéré par le
LC_CTYPE
option, tandis que les "Administration -> la Langue pour les Programmes non Unicode", la traduction de la page de code pour les noms de fichier. Dans les pays occidentaux, l'LC_CTYPE
paramètre évalue à quelque chose commelanguage_country.1252
où 1252 est la page de code, aussi connu comme "Windows-1252" codage qui est similaire (mais pas identique) à la norme ISO-8859-1. Au Japon, l'932 page de code est généralement fixé à la place, et ainsi de suite pour les autres pays. En PHP, vous pouvez créer des fichiers dont le nom peut être exprimé avec la page de code. Vice-versa, les noms de fichiers et les chemins d'accès récupérées à partir du système de fichiers sont convertis en UTF-16 octets à l'aide de la "meilleur ajustement" page de code en cours.Cette cartographie est approchée, de sorte que certains caractères risquent d'être déformés de façon imprévisible. Par exemple,
Caffé Brillì.txt
serait retourné pardir()
que la chaîne PHPCaff\xE9 Brill\xEC.txt
comme prévu si la page de codes 1252, alors qu'il serait de retour approximatifCaffe Brilli.txt
sur un système Japonais parce que les voyelles accentuées sont manquantes à partir de la page de 932 codes et remplacées par leur "best-fit" non-voyelles accentuées. Les caractères qui ne peuvent pas être traduits sont récupérées en tant que?
(point d'interrogation). En général, sous Windows il n'y a pas de moyen sûr de détecter de tels artefacts.Plus de détails sont disponibles dans ma réponse à la PHP bug pas. 47096.
PHP 7.1 supporte l'UTF-8 noms de fichiers sur Windows mépris de la page de codes OEM.
Depósito
sur le système de fichiers, comment PHP 7.1 le voir? Je pense que PHP 7.0 et 7.1 serait de voir deux des noms de fichiers différents, avec la colombie-britannique implications.Le problème est que Windows utilise utf-16 pour le système de fichier de chaînes, alors que Linux et d'autres jeux de caractères différents, mais souvent utf-8. Vous avez fourni une chaîne utf-8, mais ceci est interprété comme une autre de 8 bits de codage du jeu de caractères dans Windows, peut-être Latin-1, puis les caractères non-ascii, qui est codée avec 2 octets en utf-8, est traitée comme si elle était de 2 caractères dans Windows.
Une solution normale est de garder votre code source 100% en ascii, et d'avoir des chaînes à un autre endroit.
À l'aide de la
com_dotnet
extension PHP, vous pouvez accéder à WindowsScripting.FileSystemObject
, et ensuite faire tout ce que vous voulez avec UTF-8 fichiers/dossiers noms.J'ai emballé ce que PHP gestionnaire de flux, de sorte qu'il est très facile à utiliser :
https://github.com/nicolas-grekas/Patchwork-UTF8/blob/lab-windows-fs/class/Patchwork/Utf8/WinFsStreamWrapper.php
D'abord vérifier que la
com_dotnet
extension est bien activée dans votrephp.ini
puis activer le wrapper avec:
Enfin, utiliser les fonctions que vous êtes habitué (mkdir, fopen, renommer, etc.), mais préfixe votre chemin avec
win://
Par exemple:
Vous pouvez utiliser cette extension pour résoudre votre problème: https://github.com/kenjiuno/php-wfio
Essayer de CodeIgniter Texte helper de ce lien
Lisez à propos de convert_accented_characters() la fonction, il peut être costumised
Mon ensemble d'outils à utiliser le système de fichier en UTF-8 sur windows OU linux via
PHP
et compatible avec.htaccess
vérifier l'existence du fichier:Des ressources supplémentaires
Je n'ai pas besoin d'écrire beaucoup, ça fonctionne bien: