Wie verwende ich die Dateisystem-Funktionen in PHP mit UTF-8 strings?
Kann ich nicht verwenden mkdir
zum erstellen von Ordnern mit UTF-8-Zeichen:
<?php
$dir_name = "Depósito";
mkdir($dir_name);
?>
wenn ich surfen Sie diese Ordner in Windows Explorer den Namen des Ordners sieht wie folgt aus:
Depósito
Was soll ich tun?
Ich bin mit php5
InformationsquelleAutor Acacio Nerull | 2009-10-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur
urlencode
den gewünschten string als Dateinamen. Alle Zeichen zurückgegeben, die vonurlencode
sind gültig in Dateinamen (NTFS/HFS/UNIX), dann kann man nururldecode
den Dateinamen wieder zurück zu UTF-8 (oder was auch immer-Codierung, die Sie waren).Vorbehalte (alle anwenden, um die Lösungen unterhalb als auch):
glob
oder Wiedereröffnung einer einzelnen Datei.scandir
oder ähnliche Funktionen für die alpha-Sortierung. Sie müssenurldecode
die Dateinamen dann verwenden Sie einen Sortier-Algorithmus bewusst UTF-8 (und Sortierungen).Schlimmer Lösungen
Den folgenden weniger attraktiv sind Lösungen, komplizierter und mit mehr Einschränkungen.
Unter Windows die PHP-filesystem wrapper erwartet und gibt ISO-8859-1-strings für Datei - /Verzeichnis-Namen. Dies gibt Ihnen zwei Möglichkeiten:
UTF-8 frei in Ihrem Dateinamen, aber verstehen, dass nicht-ASCII-Zeichen werden falsch angezeigt außerhalb von PHP. Ein nicht-ASCII-UTF-8 char gespeichert werden, da mehrere single ISO-8859-1-Zeichen. E. g.
ó
wird angezeigt, wieó
im Windows-Explorer.Beschränken Sie Ihre Datei - /Verzeichnis-Namen zu Zeichen darstellbar, die in ISO-8859-1. In der Praxis ist, werden Sie geben Ihre UTF-8-Zeichenfolgen durch
utf8_decode
vor der Verwendung in der Dateisystem-Funktionen, und übergeben Sie die Einträgescandir
gibt Sie durchutf8_encode
, um die original-Dateinamen in UTF-8.Vorbehalte in Hülle und fülle!
mb_convert_encoding
stattutf8_decode
.Dieser Alptraum ist, warum Sie sollten wahrscheinlich nur transliterate zum erstellen von Dateinamen.
Diese Antwort ist nicht für mich arbeiten.
mkdir('Depósito')
erstelltDep%C3%B3sito
ich kann nicht wirklich glauben, dass das, was der OP will, obwohl er es akzeptierte diese Antwort. Siehe Umberto Salsi Antwort für das, was wirklich vor sich geht und wie man eine richtige Lösung mitsetlocale()
undiconv()
.PHP ' s Verhalten hat sich geändert mit PHP 7.1 - haben Sie einen Blick auf stackoverflow.com/a/38466772/680382
InformationsquelleAutor Steve Clay
Unter Unix und Linux (und evtl. auch unter OS X auch), die aktuelle Datei-system Codierung ist die
LC_CTYPE
locale-parameter (siehe Funktionsetlocale()
). Es kann zum Beispiel auswerten, um so etwas wieen_US.UTF-8
das bedeutet, dass die Kodierung ist UTF-8. Dann die Dateinamen und deren Pfade erstellt werden können, mitfopen()
oder abgerufen werden, indemdir()
mit dieser Codierung.Unter Windows, PHP läuft als "nicht-Unicode-aware-Programm", dann Datei-Namen werden konvertiert und wieder zurück zu UTF-16 verwendet die Datei system (Windows 2000 und höher), um die ausgewählten "Codepage". Der Systemsteuerung unter "regions-und Sprachoptionen", Registerkarte " panel "Formate" setzt die code-Seite abgerufen, indem die
LC_CTYPE
option, während die "Verwaltungs -> Sprache für nicht-Unicode-Programme" stellt die übersetzung der code-Seite für die Datei-Namen. In den westlichen Ländern dieLC_CTYPE
parameter auswertet, um so etwas wielanguage_country.1252
wo 1252 ist der code-Seite, auch bekannt als "Windows-1252-Codierung", die ist ähnlich (aber nicht genau gleiche) ISO-8859-1. In Japan ist der code 932 Seite ist in der Regel statt, und so weiter für die anderen Länder. Unter PHP können Sie Dateien anlegen, deren Namen zum Ausdruck gebracht werden kann mit den aktuellen code-Seite. Umgekehrt, Dateinamen und Pfade aus der Datei abgerufen werden system konvertiert von UTF-16 bytes mit dem "best-fit" aktuellen Codepage.Dieses mapping angenähert, so dass einige Zeichen möglicherweise verstümmelt in einer unvorhersehbaren Art und Weise. Zum Beispiel
Caffé Brillì.txt
würde zurückgegeben werden, die vondir()
als PHP-stringCaff\xE9 Brill\xEC.txt
wie erwartet, wenn der aktuelle Codepage 1252, während er zurückkehren würde, die UngefähreCaffe Brilli.txt
auf einem japanischen system, weil akzentuierte Vokale fehlen 932 code Seite und dann ersetzt mit Ihrem "best-fit" nicht-akzentuierte Vokale. Zeichen, die nicht übersetzt werden in alle abgerufen werden, wie?
(Fragezeichen). Im Allgemeinen, unter Windows gibt es keinen sicheren Weg zu erkennen, wie Artefakte.Mehr details finden Sie in meiner Antwort auf die PHP Fehler nicht. 47096.
InformationsquelleAutor Umberto Salsi
PHP 7.1 unterstützt UTF-8-Dateinamen auf Windows-abgesehen von der OEM-codepage.
Depósito
auf das Dateisystem, wie funktioniert PHP 7.1 es sehen? Ich würde denken, dass PHP 7.0 und 7.1 würde sehen zwei verschiedene Dateinamen mit BC Auswirkungen.Du hast Recht. Wie 7.1 würde es sehen, hängt von der default_charset. Dein Beispiel natürlich Zeugen die situation bis 7.1 - UTF-8-Zeichenfolge übergeben wird, die ANSI-API. Zu zwingen, das alte Verhalten, ist es nur erforderlich ist, um den default_charset auf einige single-byte-Zeichensatz, in der Regel, um das system ANSI-oder OEM-codepage. Ansonsten, mit default_charset=UTF-8 standardmäßig den Dateinamen geschrieben werden und richtig gelesen. Mehr Infos hier github.com/php/php-src/blob/PHP-7.1/UPGRADING#L391 . Danke.
InformationsquelleAutor Anatol Belski
Das problem ist, dass Windows verwendet utf-16 für filesystem-strings, in der Erwägung, dass Linux und andere verwenden andere Zeichensätze, aber oft utf-8. Sofern Sie einen utf-8 string, aber diese wird interpretiert als ein weiterer 8-bit-Zeichensatz-Codierung in Windows, vielleicht Latin-1, und dann die nicht-ascii-Zeichen, die codiert 2 bytes in utf-8, wird behandelt, als wenn es 2 Zeichen in Windows.
Eine normale Lösung ist, um Ihre source-code zu 100% in ascii und Streicher woanders.
Ich habe es nicht ausprobiert, aber kann Sie nicht verwenden, mb_convert_encoding zu konvertieren Sie die Zeichenfolge im utf-16?
InformationsquelleAutor Lars D
Mithilfe der
com_dotnet
PHP-Erweiterung, können Sie den Zugriff auf Windows'Scripting.FileSystemObject
, und dann tun Sie alles, was Sie wollen mit UTF-8-Dateien/Ordner-Namen.Ich verpackte dies als PHP-stream-wrapper, so ist es sehr einfach zu bedienen :
https://github.com/nicolas-grekas/Patchwork-UTF8/blob/lab-windows-fs/class/Patchwork/Utf8/WinFsStreamWrapper.php
Zuerst überprüfen, dass die
com_dotnet
- Erweiterung aktiviert ist, die in Ihremphp.ini
dann aktivieren Sie den wrapper mit:
Schließlich, verwenden Sie die Funktionen, die Sie gewohnt sind (mkdir, fopen, umbenennen, etc.), aber Präfix Ihren Weg mit
win://
Beispiel:
InformationsquelleAutor Nicolas Grekas
Könnten Sie diese Erweiterung, um Ihr Problem zu lösen: https://github.com/kenjiuno/php-wfio
InformationsquelleAutor Oleg
Versuchen CodeIgniter Text-Helfer aus dieser link
Lesen Sie über convert_accented_characters () - Funktion, es kann sein, costumised
InformationsquelleAutor TomoMiha
Mein set von tools für die Verwendung von filesystem mit UTF-8 auf windows - ODER linux via
PHP
und kompatibel mit.htaccess
check file exists:Zusätzliche Ressourcen
InformationsquelleAutor RafaSashi
Brauche ich nicht viel schreiben, es funktioniert gut:
InformationsquelleAutor Yesterday