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?
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 .:
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)
)
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.
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.