• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Probleme mit html_entity_decode

thuemmy

Aktives Mitglied
Was bei mir die ganze Zeit auf localhost klappte, klappt nun in der Echtumgebung nicht mehr :twisted:

Ausgangssituation:
MySQL-Tabelle mit einem Textfeld, das duch den CKEditor gefüllt wird, soll heißen, der Text hat Entities, z.B.
<h3>&quot;Garten-Olafs&quot; Kalendergedanken f&uuml;r den April</h3>

<p>Liebe Gartenfreunde,<br />
mit einer dem Volksmund entliehenen Weisheit m&ouml;chte ich heute starten:</p>
Angezeigt wird das ganze mit
PHP:
echo html_entity_decode($zeile->artikel);
Auf localhost funktioniert das alles einwandfrei, auf dem Webspace sieht das so aus: Kleingärtnerverein Priessnitz-Morgenröte - Fachberater Aber eben nur der Text aus der Datenbank.

Wenn ich html_entity_decode weglasse, sieht das natürlich richtig aus. Kleingärtnerverein Priessnitz-Morgenröte - Fachberater Aber warum lasse ich meine Seite in utf-8 ausliefern, wenn das dann nicht gehen sollte?
 
Zuletzt bearbeitet:
Werbung:
Der <meta>-Tag sagt eigentlich gar nichts über den Zeichensatz aus. Dieser dient nur dazu, bei Offline-Besichtigungen der Seite (nachdem man sie auf der Festplatte gespeichert hat) den Zeichensatz korrekt festzulegen.

Online hat dieser Tag keinen Einfluss auf den Zeichensatz.

Ich habe mir mal die Header angeschaut, die dein Script sendet und etwas sagt mir, dass das Problem dadurch verursacht wurde, dass du dich zu sehr auf Standardeinstellungen stützt:
Code:
Date: Mon, 08 Apr 2013 23:01:15 GMT
Server: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8r
X-Powered-By: PHP/5.3.22
Keep-Alive: timeout=3, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html

200 OK
Du sendest gar keinen Charset. Korrekt müsste es so senden:
PHP:
header("Content-Type: text/html; charset=utf-8");

Das ist das erste Problem. Aber Charset-Probleme sind noch anderweitig zu beheben: Die Script-Dateien müssen auch als UTF-8-Dokumente abgespeichert werden (in diesem Fall wird das aber normalerweise nicht helfen).

Die Datenbank muss auch UTF-8 sprechen.
Text-Felder und Tabellen müssen UTF-8 encoded sein:
Code:
create table tabelle (
    content text not null collate utf8_unicode_ci
) charset=utf8 collate=utf8_unicode_ci;
Die Verbindung, die du mit dem MySQL-Server aufbaust, muss auch UTF-8 sprechen.
Bei mysqli so:
PHP:
$mysqli = new mysqli();
$mysqli->set_charset("utf8");
// oder
mysqli_set_charset($mysqli, "utf8");
In PDO so:
PHP:
$pdo = new PDO();
$pdo->exec("set names utf8");
$pdo->exec("set character set 'utf8'");

Ich hoffe, ich habe nichts vergessen ^^
 
Der <meta>-Tag sagt eigentlich gar nichts über den Zeichensatz aus. Dieser dient nur dazu, bei Offline-Besichtigungen der Seite (nachdem man sie auf der Festplatte gespeichert hat) den Zeichensatz korrekt festzulegen.

Online hat dieser Tag keinen Einfluss auf den Zeichensatz.

Ich habe mir mal die Header angeschaut, die dein Script sendet und etwas sagt mir, dass das Problem dadurch verursacht wurde, dass du dich zu sehr auf Standardeinstellungen stützt:
Code:
Date: Mon, 08 Apr 2013 23:01:15 GMT
Server: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8r
X-Powered-By: PHP/5.3.22
Keep-Alive: timeout=3, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html
200 OK
Ich habe mir mit Firefox die Seiteninformation der bestehenden Website angesehen und da wurde mir gezeigt, dass die Seiten mit UTF-8_Codierung ausgeliefert werden

Du sendest gar keinen Charset. Korrekt müsste es so senden:
PHP:
header("Content-Type: text/html; charset=utf-8");
Auch das habe ich gemacht

Die Datenbank muss auch UTF-8 sprechen.
Text-Felder und Tabellen müssen UTF-8 encoded sein:
Code:
create table tabelle (
    content text not null collate utf8_unicode_ci
) charset=utf8 collate=utf8_unicode_ci;
Habe ich mit
Code:
alter table
geändert.Vorher war allerdings schon utf8_general_ci, zumindest die Tabelle, das entsprechende Feld habe ich auch geändert.

Die Verbindung, die du mit dem MySQL-Server aufbaust, muss auch UTF-8 sprechen.
Bei mysqli so:
PHP:
$mysqli = new mysqli();
$mysqli->set_charset("utf8");
// oder
mysqli_set_charset($mysqli, "utf8");
Das hatte ich vorher schon
 
Werbung:
Online hat dieser Tag keinen Einfluss auf den Zeichensatz.

Der meta-Tag hat auch beim Aufruf über einen Webserver eine Bedeutung wenn im HTTP-Header kein Zeichensatz mitgeliefert wird, wie in diesem Fall hier offenbar. Daher erkennt der Browser die Seite auch als Seite mit utf8-Zeichensatz.

Die Ursache ist eine andere:
HTML:
echo html_entity_decode($zeile->artikel);

Hier verwendest Du eine Funktion ohne Angabe, in welchem Zeichensatz die Ausgabe erfolgen soll. Diese Angabe ist hier offenbar notwendig, da html_entity_decode erst seit PHP Version 5.4 mit utf8 als Standard-Zeichensatz arbeitet. Auf deinem Webserver ist scheinbar eine ältere PHP-Version vorhanden. Ändere diese Zeile daher (analog dem Manual) mal zu:
PHP:
echo html_entity_decode ( $zeile->artikel, ENT_COMPAT, 'UTF-8');
 
In der Tat, das war es, auf dem Webspace läuft PHP > 5.3 und in der Testumgebung > 5.4

Vielen Dank, an Euch Beide, für die Bemühungen, dann kann ich ja jetzt herangehen, und das ganze richtig online stellen.

Gruß von einem glücklichen thuemmy
 
Zurück
Oben