Arbeiten mit Dateien und utf8 in PHP

8

Sagen wir, ich habe eine Datei namens foo.txt, die in utf8 kodiert ist:

%Vor%

Und ich möchte ein Array erhalten, das alle Zeilen in dieser Datei enthält (eine Zeile pro Index), die die Buchstaben aoeuñpyf haben, und nur die Zeilen mit diesen Buchstaben.

Ich habe den folgenden Code geschrieben (auch als utf8 kodiert):

%Vor%

Danach hat das Array $lines jedoch nur die aoeu-Zeile Das scheint so zu sein, weil das "ñ" in $allowed_letters irgendwie nicht dasselbe ist wie das "ñ" in foo.txt.
Auch wenn ich ein "ñ" der Datei drucke, erscheint ein Fragezeichen, aber wenn ich es wie dieses print "ñ"; drucke, funktioniert es.
Wie kann ich es zum Laufen bringen?

    
Gerardo Marset 26.09.2010, 23:36
quelle

3 Antworten

10

Wenn Sie Windows verwenden, speichert das Betriebssystem keine Dateien in UTF-8, aber in cp1251 (oder etwas ...) müssen Sie die Datei standardmäßig in diesem Format speichern oder jede Zeile in utf8_encode() ausführen. bevor Sie Ihren Scheck ausfüllen. I.e .:

%Vor%

Wenn Sie sicher sind, dass die Datei UTF-8-kodiert ist, ist Ihre PHP-Datei auch UTF-8-codiert?

Wenn alles UTF-8 ist, dann brauchen Sie das:

%Vor%

(append u für Unicode-Zeichen)

Lassen Sie mich jedoch einen noch schnelleren Weg vorschlagen, um Ihren Scheck durchzuführen:

%Vor%

(fügen Sie Leerzeichen hinzu, um auch Leerzeichen zuzulassen, und entfernen Sie das rtrim($line) )

    
Yanick Rochon 26.09.2010, 23:54
quelle
2

In UTF-8 wird ñ als zwei Bytes codiert. Normalerweise sind in PHP alle String-Operationen bytebasiert, dh wenn Sie preg_split eingeben, teilt sie das erste Byte und das zweite Byte in separate Array-Elemente auf. Weder das erste Byte für sich allein noch das zweite Byte für sich werden beide Bytes zusammenpassen, wie in $allowed_letters gefunden, so dass es niemals mit ñ übereinstimmt.

Wie Yanick geschrieben hat, besteht die Lösung darin, den u -Modifikator hinzuzufügen. Dies bewirkt, dass die PHP-Regex-Engine sowohl das Muster als auch die Eingabezeile als Unicode-Zeichen anstelle von Bytes behandelt. Es ist ein Glück, dass PHP hier spezielle Unicode-Unterstützung hat; An anderer Stelle ist die Unicode-Unterstützung von PHP extrem fleckig.

Ein einfacherer und schnellerer Weg als das Teilen wäre, jede Zeile mit einer Zeichengruppen-Regex zu vergleichen. Auch dies muss ein u Regex sein.

%Vor%     
bobince 27.09.2010 00:28
quelle
0

Es klingt, als hätten Sie Ihre Antwort bereits erhalten, aber es ist wichtig zu erkennen, dass Unicode-Zeichen auf verschiedene Arten gespeichert werden können. Unicode-Normalisierung * ist ein Prozess, der dazu beitragen kann, dass die Vergleiche wie erwartet funktionieren.

M2tM 27.09.2010 00:07
quelle

Tags und Links