Problem mit UTF-8 + ß + (u.a.) strrev
Dani
- php
Hi und Hallo,
folgende Funktion will einfach nicht laufen:
function apostrophe($name)
{
if(stripos(strrev($name), 's') === 0)
{
return $name.''';
}
elseif(stripos(strrev($name), 's') === 0 && stripos(strrev($name), 's') === 1)
{
return $name.''';
}
elseif(stripos(strrev($name), 'ß') === 0)
{
return $name.''';
}
elseif(stripos(strrev($name), 'x') === 0)
{
return $name.''';
}
elseif(stripos(strrev($name), 'z') === 0)
{
return $name.''';
}
elseif(stripos(strrev($name), 'e') === 0 && stripos(strrev($name), 'c') === 1)
{
return $name.''';
}
else
{
return $name.'s';
}
}
Das Problem ist, dass im UTF-8 das Zeichen ß zwei zeichen sind, soviel ich weiß.
Das ß wird einfach nicht richtig erkannt, jawohl alle Dateien, Server-Einstellungen und und und auf UTF-8 stehen. Weiß jemand zufällig wie ich das Problem beheben kann, dass diese Funktion läuft und das ß richtig erkannt wird?
elseif(stripos(strrev($name), 'ß') === 0)
Das Problem ist, dass im UTF-8 das Zeichen ß zwei zeichen sind, soviel ich weiß.
Nein, ß ist immer nur ein Zeichen, es wird in utf-8 lediglich in Form von zwei Bytes gespeichert.
Das ß wird einfach nicht richtig erkannt, jawohl alle Dateien, Server-Einstellungen und und und auf UTF-8 stehen.
Dein Problem ist, dass PHP schlampig geschrieben wurde (jawohl) und Zeichenketten nicht als Zeichenketten, sondern als Byteketten behandelt. strrev() dreht dementsprechend nicht die Reihenfolge der Zeichen um, sondern die der Bytes, was sich auf ein Zeichen, das mehr als ein Byte belegt, logischerweise fatal auswirkt; aus den zwei Bytes c3 9f, die das ß in utf-8 darstellen, wird 9f c3. 9f c3 ist a) ein völlig anderes Zeichen (wenn überhaupt) und b) vor allen Dingen nicht c3 9f, mit dem du bzw. stripos() vergleicht. Ist die PHP-Datei davon unabhängig nicht utf-8-kodiert (im Editor einstellen, nicht im Server!), vergleichst du obendrein auch noch mit dem Byte df.
ich habe die Zeile nun ersetzt durch:
elseif(stripos(strrev($name), 'Ÿ') === 0 && stripos(strrev($name), 'Ã') === 1)
nun gehts... danke für deine info!
ich habe die Zeile nun ersetzt durch:
elseif(stripos(strrev($name), 'Ÿ') === 0 && stripos(strrev($name), 'Ã') === 1)
Ohne das jetzt nachgucken zu wollen, aber das Ÿ kommt mir etwas Spanisch vor. Ich bin der Meinung, es hätte den Wert ff und dürfte dementsprechend an der Stelle nicht passen, egal ob das Skript nun iso-8859-1- oder utf-8-kodiert ist.
Wie dem auch sei, ich täte folgendes benutzen, weil ich damit jeglichem Kodierungsärger aus dem Weg gehe:
elseif (stripos(strrev($name), "\x9f\xc3") === 0)
Und eigentlich sogar eher dieses, weil ich mir damit obendrein das lästige Textumdrehen spare:
elseif (substr($name, -2) === "\xc3\x9f")
Die in der Funktion gleiche, aber etwas deutlichere Zeile
elseif (substr($name, -2) === "ß")
sollte auch funktionieren, vorausgesetzt, der Editor speichert die Skriptdatei utf-8-kodiert.
Hallo miteinander,
ich möchte doch in diesem Thread (weil das seltsamerweise noch nicht passiert ist) auf die mbstring-Extension von PHP hinweisen, mit der das "normalerweise" gemacht wird.
http://php.net/manual/en/ref.mbstring.php
Diese Abfrage auf die umgedrehten Bytes finde ich ja ganz ganz grausam ;-)
Ausserdem täte ich das letzte Zeichen auch vor dem If-Block in eine Variable schreiben, um die Berechnungen nicht jedesmal ausführen zu müssen (Erbsenzählerei, aber hey) -- oder am besten gleich ein switch:
http://de.php.net/manual/en/control-structures.switch.php
Liebe Grüße,
Gero