2009-07-07 13 views
3

Ich habe eine Datei mit Unicode-Zeichen auf einem Server mit Linux. Wenn ich SSH auf dem Server anwende und Tabulatorvervollständigung verwende, um zu der Datei/dem Ordner zu navigieren, der Unicode-Zeichen enthält, habe ich kein Problem, auf die Datei/den Ordner zuzugreifen. Das Problem tritt auf, wenn ich versuche, über PHP auf die Datei zuzugreifen (die Funktion, von der aus ich auf das Dateisystem zugreift, war stat). Wenn ich den vom PHP-Skript generierten Pfad zum Browser austrage und in das Terminal einfüge, scheint die Datei ebenfalls zu existieren (obwohl die Dateipfade beim Blick auf das Terminal genau gleich sind).UTF8 Dateinamen in PHP und verschiedene Unicode-Kodierungen

I gesetzt PHP UTF8 als Standard-Kodierung über php_ini sowie mb_internal_encoding Set zu verwenden. Ich habe die Kodierung der PHP-Dateipfadzeichenfolge überprüft und sie kommt wie UTF8 heraus. Stochert ein bisschen mehr ich hexdump den é Charakter entschieden, dass das Terminal Tab-Vervollständigung und vergleichen Sie es mit den hexdump des ‚normalen‘ é Charakter durch das PHP-Skript erstellt oder von im Zeichen über die Tastatur (Option + e manuelle Eingabe + e auf os x). Hier ist das Ergebnis:

 
echo -n é | hexdump 
0000000 cc65 0081        
0000003 
echo -n é | hexdump 
0000000 a9c3         
0000002 

Die é Zeichen, das eine korrekte Dateireferenz in dem Endgerät ermöglicht, ist der 3-Byte ein. Ich bin mir nicht sicher, wohin ich von hier aus gehen soll, welche Kodierung sollte ich in PHP verwenden? Sollte ich den Pfad zu einer anderen Kodierung über oder mb_convert_encoding konvertieren?

Antwort

4

Dank der Tipps, die in den zwei Antworten gegeben wurden, konnte ich herumstochern und einige Methoden finden, um die verschiedenen Unicode-Zerlegungen eines bestimmten Zeichens zu normalisieren. In der Situation, in der ich konfrontiert war, habe ich auf Dateien zugegriffen, die von einer OS X Carbon-Anwendung erstellt wurden. Es ist eine ziemlich populäre Anwendung und somit scheinen die Dateinamen einer bestimmten Unicode-Dekomposition zu folgen.

In PHP 5.3 wurde ein new set of functions eingeführt, mit dem Sie eine Unicode-Zeichenfolge zu einer bestimmten Dekomposition normalisieren können. Offenbar gibt es vier Dekompositionsstandards, in die Sie Ihre Unicode-Zeichenfolge zerlegen können. Python hat Unicode-Normalisierungsfähigkeiten seit Version 2.3 über unicode.normalize.This article auf Python Umgang mit Unicode-Strings war hilfreich beim Verständnis der Codierung/String-Behandlung ein bisschen besser.

Hier ist ein kurzes Beispiel für einen Unicode-Dateipfad zu normalisieren:

filePath = unicodedata.normalize('NFD', filePath) 

Ich fand, dass das NFD-Format für all meine Zwecke gearbeitet, ich frage mich, ob dies ist dies die Standard Zersetzung für Unicode-Dateinamen ist.

3

Die Drei-Byte-Sequenz ist eigentlich die utf8-Darstellung eines e (0x65), gefolgt von einem combining ´ (0xcc 0x81), während 0xc3 0xa9 steht "direkt" für é.
Eine utf-8 bewusst Sortierungs sollten die möglichen Zerlegungen bewusst sein, aber ich weiß nicht, wie Sie, dass aktivieren können (und wahrscheinlich auch die PHP-Quelle neu kompilieren) auf einem Mac.
Beste, die ich anbieten kann, ist die "Using UTF-8 with Gentoo" Beschreibung.

1

Erstens: Sie sollten versuchen, auf den Namen von Dateien zur Einführung Semantik zu vermeiden. Ich kann nicht wirklich sagen, warum PHP Dateinamen in Ihrem Szenario erzeugt, also kann ich nicht vorschlagen, wie Sie diese Regel anwenden sollten.

Die verschiedenen (zwei Byte und drei Byte) Darstellungen von E sind UTF-8-Codierungen der zusammengesetzt und zerlegt Variationen dieses Zeichen in Unicode. In Unicode sind dies verschiedene Möglichkeiten, denselben visuellen Charakter darzustellen. Unicode hat das Konzept der "Kanonisierung", bei dem alle Darstellungen desselben Zeichens in eine einzige Darstellung umgewandelt werden, etwa so, als würden zwei Zeichenketten in Kleinbuchstaben zerlegt, um einen hüllenlosen Vergleich durchzuführen.

Linux führt keine Kanonisierung oder eine andere Verarbeitung automatisch für Dateinamen durch, daher kann eine Datei mit vorkomposierten (wie die Zwei-Byte-Sequenz) oder zerlegten (wie die Drei-Byte-Sequenz) Zeichen oder einer Mischung aus beiden benannt werden. Es ist Sache desjenigen, der die Datei benannt hat. Wenn Sie die Dateien erstellen, können Sie eine Richtlinie festlegen (z. B. immer vorkompo- nierte Zeichen verwenden) und Code schreiben, um sie durchzusetzen. Ansonsten können Sie sich hier nicht auf eine bestimmte Regel verlassen.