Seite 1 von 1
Codierungsfehler bei Benutzung von substr
Verfasst: 24.09.2008 02:15
von Seether
Hallo Leute,
ich lese derzeit die Topics aus und will sie an anderer Stelle anzeigen lassen.
Beispielsatz:
Ich bin zurück
Bei zu langen Topics lass ich mit substr den String abschneiden und setze 3 ... dran.
So nun habe ich das Problem, dass wenn der Schnitt direkt vor einem Umlaut erfolgt auf der Webseite das Rautensymbol mit ? des Firefox angezeigt wird....
Testweise habe ich dann die angezeigten Stellen um 1 erhöht und dann wird das ü sauber ausgegeben...
Ich kapiere die Logik dahinter nicht... Jemand von euch?
S.
Verfasst: 24.09.2008 13:32
von Valerion
Wenn du das Script posten würdest könnte man dir vielleicht besser helfen.
Ich verstehe jedoch momentan dein Problem nicht...
Verfasst: 24.09.2008 14:31
von Seether
Habe es weggelassen weil ich dachte es sei nicht von belang
Code: Alles auswählen
$sql = "SELECT t.topic_title
FROM phpbb3_topics t
LEFT JOIN phpbb3_posts p ON (t.topic_id = p.topic_id)
ORDER by p.post_time DESC
LIMIT 5";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$topic_title = $row['topic_title'];
$topic_title = (strlen($topic_title) < 11 ) ? $topic_title : substr(str_replace("ü", "ä", $topic_title), 0, 10);
Das Problem ist folgendes. Je nach Anzahl der Zeichen steht dort entweder:
Ich bin zur�
oder
Ich bin zurü
oder
Ich bin zurück
Sprich es hängt mit der Anzahl der Zeichen zurück ob ein Umlaut richtig umgewandelt wird oder nicht
Verfasst: 24.09.2008 19:31
von BB-BF-BM
Hallo!
Da PHP UTF-8 erst mit Version 6 vollständig unterstützen wird, muss man sich bei String-Funktionen bisher selbst helfen. phpBB3 bietet glücklicherweise in der Datei /includes/utf/utf_tools.php eine Funktionssammlung an, die UTF-8-sichere String-Funktionen enthält.
An dieser Stelle sollten für dich utf8_strlen() und utf8_substr() geeignet sein!
Verfasst: 24.09.2008 19:49
von Seether
BB-BF-BM hat geschrieben:Hallo!
An dieser Stelle sollten für dich utf8_strlen() und utf8_substr() geeignet sein!
Es läuft! Hammer Tipp

Verfasst: 25.09.2008 06:40
von gn#36
Vielleicht noch als Hintergrund um den Fehler besser verstehen zu können: Bei einem UTF8 encodierten String bestehen reguläre ASCII Zeichen (also a-z 0-9 usw.) aus einem Byte. Sonderzeichen die nicht im Standard ASCII Satz enthalten sind werden mit zwei Byte encodiert, sind also doppelt so lang. Andere Zeichensätze regeln das anders (z.b. indem alle Zeichen ein zusätzliches Bit spendiert bekommen verdoppelt man den möglichen Zeichenbereich). Wenn jetzt eine Funktion stur nach der Zeichenzahl geht und dabei ignoriert dass es Zeichen geben kann die doppelt so lang sind dann kann es passieren, dass sie mitten in einem Buchstaben durchschneidet, mit obigem Ergebnis.