In meinem Forum, in dem es um die Thai-Sprache geht, gibt es Probleme, wenn eben diese Sprache in topic_title und post_subject verwendet wird. In forum_name dagegen funktioniert es bestens.
phpBB ersetzt "&" html-konform durch "&", dadurch wird allerdings die Codierung der Unicode-Zeichen (z. B. &# 3652;) zu "ไ" und damit nicht mehr als Zeichen darstellbar. Wenn ich in der Datenbank die eingefügten "amp;" entferne, wird die Schrift richtig angezeigt, wenn auch etwas zu klein.
Kann mir jemand helfen, dafür zu sorgen, dass diese Ersetzung beim Schreiben in die Datenbank nicht statt findet? Bei forum_name und im Text wird es ja auch nicht gemacht. Schön wäre es außerdem, wenn ich die Schrift bei der Anzeige derartig codierter Zeichen automatisch vergrößern könnte.
Leider bin ich kein php-Programmierer, komme aber mit der Art der Anweisungen bei mods ganz gut zurecht.
Unicode-Zeichen in topic_title und post_subject
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.1, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.1, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
- D@ve
- Ehemaliges Teammitglied
- Beiträge: 3842
- Registriert: 28.08.2002 19:33
- Wohnort: Bretzfeld
- Kontaktdaten:
Also den entsprechenden Teil findest Du in der includes/functions_post.php, irgendwo bei Zeile 150 ff bei
Dort wird mit htmlspecialchars() die Sonderzeichen in Ihre HTML-Pedate umgewandelt.
Allerdings solltest Du bedenken, dass Du Dir mit der entfernung der Funktion ein Sicherheitsloch einbaust, ganz zu schweigen davon, dass Dir ein Poster mit einem entsprechenden Subjekt ziemlich schnell das Design zerlegen kann.
Ich kenn mir mich mit diesem Schrift-Kram nicht so wirklich aus, aber wäre es nicht einfacher von vornherein mit einem anderen Charset zu arbeiten?
Gruß, Dave
Code: Alles auswählen
// Check subject
Allerdings solltest Du bedenken, dass Du Dir mit der entfernung der Funktion ein Sicherheitsloch einbaust, ganz zu schweigen davon, dass Dir ein Poster mit einem entsprechenden Subjekt ziemlich schnell das Design zerlegen kann.
Ich kenn mir mich mit diesem Schrift-Kram nicht so wirklich aus, aber wäre es nicht einfacher von vornherein mit einem anderen Charset zu arbeiten?
Gruß, Dave
There are only 10 types of people in the world: Those who understand binary, and those who don't
Danke, diese Stelle habe ich gesucht...
Am Anfang der gleichen Datei finde ich
$html_entities_match = array('#&(?!(\#[0-9]+;))#', '#<#', '#>#');
$html_entities_replace = array('&', '<', '>');
Auch wenn ich die regex nicht hundertprozentig verstanden habe, glaube ich doch, dass sie genau dann eine Ausnahme macht, wenn das Ampersand in etwas wie "Ӓ" steht und preg_replace() in diesem Fall nicht ersetzt. Was sagen deine Sicherheitsbedenken, wenn ich die vorhandene Zeile (an der von dier angegebenen Stelle)
$subject = htmlspecialchars(trim($subject));
durch
$subject = preg_replace($html_entities_match, $html_entities_replace, $subject);
ersetze? Würde der Code funktionieren?
Normale Ampersand würden dann ersetzt, die von Unicode-Zeichen nicht.
Mit einem anderen Charset zu arbeiten scheidet aus, da alle modernen Betriebssysteme (Windows, Mac, Linux) mittlerweile Unicode genau so in Webformulare eintragen.
Am Anfang der gleichen Datei finde ich
$html_entities_match = array('#&(?!(\#[0-9]+;))#', '#<#', '#>#');
$html_entities_replace = array('&', '<', '>');
Auch wenn ich die regex nicht hundertprozentig verstanden habe, glaube ich doch, dass sie genau dann eine Ausnahme macht, wenn das Ampersand in etwas wie "Ӓ" steht und preg_replace() in diesem Fall nicht ersetzt. Was sagen deine Sicherheitsbedenken, wenn ich die vorhandene Zeile (an der von dier angegebenen Stelle)
$subject = htmlspecialchars(trim($subject));
durch
$subject = preg_replace($html_entities_match, $html_entities_replace, $subject);
ersetze? Würde der Code funktionieren?
Normale Ampersand würden dann ersetzt, die von Unicode-Zeichen nicht.
Mit einem anderen Charset zu arbeiten scheidet aus, da alle modernen Betriebssysteme (Windows, Mac, Linux) mittlerweile Unicode genau so in Webformulare eintragen.
Problem gelöst
Ich habe es jetzt so gemacht:
$subject = str_replace('&#', '&#', htmlspecialchars(trim($subject)));
d.h. ich lasse die specialchars zwar ersetzen, tausche jedoch die Kennung für Unicodes wieder zurück. Und es funktioniert!
Danke für den Tip!
Gruß
Theo
$subject = str_replace('&#', '&#', htmlspecialchars(trim($subject)));
d.h. ich lasse die specialchars zwar ersetzen, tausche jedoch die Kennung für Unicodes wieder zurück. Und es funktioniert!
Danke für den Tip!
Gruß
Theo