Hallo PHPUG München,
Nach längerer Abwesenheit hier wieder ein kurzer Artikel von mir. Ich weiß nicht, ob nur ich bislang so unwissend war, aber vielleicht geht es euch ja wie mir...
Ich arbeite in meinen Projekten eigentlich durchgängig mit UTF-8 Kodierung. Fragt mich nicht warum, hab irgendwann damit angefangen (sicher mit gutem Grund), in der Zwischenzeit ist das Standard bei mir.
Letztens hatte ich aber ein eigentümliches Problem: wenn in einem String, den ich mit wordwrap fix umbreche (also auch innerhalb von strings, zusatzparameter "cut" auf true setze), an der Umbruchstelle ein Sonderzeichen stand (z.b. doppelte Anführungszeichen), dann wurde aus diesem einen Zeichen auf einmal 3 oder sogar 4. Es sieht so aus, als ob wordwrap nicht vorher bzw. nachher umbricht, sondern irgendwie IM Sonderzeichen und es zerreißt. Dass die inneren Quarks des Sonderzeichen-Atoms natürlich hässlich waren (und teilweise weitere Probleme verursachten) versteht sich von selbst.
Das Spannende dran: in meinen Tests konnte ich das jederzeit reproduzieren, aber nur, wenn ich das Zeichen selbst in den Quellcode geschrieben habe. Wenn ich das Zeichen über dessen ASCII-Code von PHP erzeugen lasse, war alles ok. Straaange...
Ich hab lange Zeit nichts darüber gefunden (vielleicht suche ich falsch?)und diese Funktion dann schließlich in JavaScript geschrieben, da die ganze Sache einfach zu unsicher war.
Letzte Woche hatte ich nun Gelegenheit, bei Mayflower mit zwei Experten zu sprechen und siehe da, die Lösung ist ganz einfach: wordwrap ist einfach nicht "utf-8 safe". Ihr hört richtig: man kann bzw. sollte keine utf-8 kodierten Strings mit wordwrap verarbeiten. Zusätzlich zu diesem Sonderzeichen-Bug erkennt wordwrap wohl auch die Länge des Strings nicht immer korrekt (utf-8 zeichen brauchen mehr Byte), es kann also auch hier zu Fehlern kommen.
Da es bislang noch keine utf-8 safe Variante gibt, bleibt euch wie mir nur übrig, entweder eine Alternative in PHP selbst zu schreiben (bzw. das Netz danach abzusuchen) oder das Thema z.b. JavaScript zu überlassen (was aber z.B. bei PDF-Generierung nicht funktioniert).
Ich hoffe, das hilft euch weiter!

als erstes











