Seite 1 von 1

Unicode-Zeichen in topic_title und post_subject

Verfasst: 21.02.2005 14:30
von thpitsch
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.

Verfasst: 21.02.2005 15:42
von D@ve
Also den entsprechenden Teil findest Du in der includes/functions_post.php, irgendwo bei Zeile 150 ff bei

Code: Alles auswählen

   // Check subject 
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

Verfasst: 21.02.2005 16:31
von thpitsch
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.

Problem gelöst

Verfasst: 21.02.2005 19:14
von thpitsch
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