Arbeiten mit Dateien und utf-8 in PHP
Können sagen, ich habe eine Datei namens foo.txt in utf8 kodiert:
aoeu
qjkx
ñpyf
Und ich möchte ein array mit allen Zeilen in der Datei (eine Zeile pro index), die die Buchstaben aoeuñpyf, und nur die Zeilen mit diesen Buchstaben.
Schrieb ich den folgenden code (auch als utf8 codiert):
$allowed_letters=array("a","o","e","u","ñ","p","y","f");
$lines=array();
$f=fopen("foo.txt","r");
while(!feof($f)){
$line=fgets($f);
foreach(preg_split("//",$line,-1,PREG_SPLIT_NO_EMPTY) as $letter){
if(!in_array($letter,$allowed_letters)){
$line="";
}
}
if($line!=""){
$lines[]=$line;
}
}
fclose($f);
Jedoch nach, dass die $lines
array hat nur die aoeu Zeile.
Das scheint da irgendwie das "ñ" in $allowed_letters
ist nicht das gleiche wie das "ñ" in foo.txt.
Auch wenn ich mit print ein "ñ" der Datei, wird ein Fragezeichen angezeigt, aber wenn ich es drucken, wie dies print "ñ";
es funktioniert.
Wie kann ich machen, damit es funktioniert?
- Wahrscheinlich ist dein "ñ"s sind nicht gleich: die eine ist eine single "ñ" - symbol und das andere ist Kombination von zwei Zeichen.
- Nein, das ist nicht der Fall. Spanische Tastaturen haben eine ñ-Taste, und es schreibt ein einzelnes Zeichen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Windows ausgeführt wird, das Betriebssystem nicht speichern Sie die Dateien in UTF-8, aber in cp1251 (oder so...) standardmäßig müssen Sie speichern die Datei in diesem format ausdrücklich oder führen Sie jede Zeile in
utf8_encode()
vor der Durchführung der Prüfung. I. e.:Wenn Sie sicher sind, dass die Datei in UTF-8 kodiert sind, ist Ihre PHP-Datei auch in UTF-8 codiert?
Wenn alles UTF-8 ist, dann ist dies, was Sie brauchen :
(append
u
für unicode-Zeichen)Aber, lassen Sie mich vorschlagen, eine noch schnellere Weg, um Ihre check :
(fügen Sie ein Leerzeichen chars zu ermöglichen-space-Zeichen, und entfernen Sie die
rtrim($line)
)u
ich bin unter Linux). Danke!In UTF-8,
ñ
codiert als zwei bytes. Normalerweise werden in PHP alle string-Operationen sind byte-basiert, so dass, wenn Siepreg_split
den Eingang teilt Sie sich das erste byte und das zweite byte in einzelne array-Elemente. Weder das erste byte noch das zweite byte auf seinen eigenen Willen passen beide bytes zusammen, wie in$allowed_letters
, es wird also nie mitñ
.Als Yanick geschrieben, die Lösung ist, die
u
modifier. Dies macht PHP regex engine behandelt die Muster und die Eingabe als Unicode-Zeichen anstelle von bytes. Es ist ein Glück, dass PHP hat spezielle Unicode-Unterstützung hier; anderswo PHP-Unicode-Unterstützung ist extrem fleckig.Einen einfacheren und schnelleren Weg als die Spaltung wäre Vergleich jede line gegen einen Charakter-Gruppe regex. Wieder, dies muss ein
u
regex.Es klingt wie Sie habe bereits Ihre Antworten, aber es ist wichtig zu erkennen, dass unicode-Zeichen können auf verschiedene Weise gespeichert werden. Unicode-Normalisierung* ist ein Prozess, die dazu beitragen können, dass Vergleiche wie erwartet funktionieren.