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

PHP - DB auslesen in UTF8

Ryan89

Neues Mitglied
Mal noch ne Frage an die PHP-Sektion von mir.

Ich habe mir ein Newsscript gebastelt, welches Beiträge aus einer Forensoftware auslesen kann. Diese werden auch als einzelne Seite schön angezeigt mit Umlauten usw.

Sobald ich diese in eine andere Seite includiere, werden Umlaute nicht mehr angezeigt. Musste das extra mit

PHP:
mysql_query("SET NAMES 'UTF8'");

fixen
Habe auch in PHP My Admin auf der Startseite auf utf8_general_ci gestellt.. sowie in der Datenbank unter "Operation" die Kollation auf utf8_general_ci gestellt. Weiß jemand rat?
 
Warum doktorst du an den Symptomen anstatt das Problem zu lösen? Wenn die Umlaute/Sonderzeichen falsch dargestellt werden, stimmt etwas mit der Kodierung der Seite nicht.
 
Warum doktorst du an den Symptomen anstatt das Problem zu lösen? Wenn die Umlaute/Sonderzeichen falsch dargestellt werden, stimmt etwas mit der Kodierung der Seite nicht.

Kann nicht sein, da alles in UTF-8 abgespeichert wurde. Auch im Head-bereich der index wird das charset mit utf-8 deklariert.

Nur der include der php datei, welche die forenbeiträge ausliest, wirft die umlaute nicht aus.
 
Kann nicht sein, da alles in UTF-8 abgespeichert wurde. Auch im Head-bereich der index wird das charset mit utf-8 deklariert.
Natürlich ist das so, deshalb werden ja die Zeichen falsch dargestellt. Wenn du von einer HTML Seite redest, die du über http abrufst, dann ist der http header wichtig, nciht das was im HTML Code steht.

Nur der include der php datei, welche die forenbeiträge ausliest, wirft die umlaute nicht aus.
Wenn du das etwas genauer beschreiben könntest, wäre auch zielführende Hilfe möglich
 
Ok ich führe nochmal erneut aus.

Ich besitze eine index.php datei, in der das Gerüst des Layouts vorhanden ist. Des weiteren werden bereits über

PHP:
<?php
   include("navigation.php");
?>

menüpunkte eingefügt. Diese werden hervorragend übertragen. Keine Probleme mit Umlauten (Ä,Ü,Ö). Gespeichert sind alle Dokumente im UTF8 (OHNE BOM)-format.

Jetzt habe ich ein altes Newsscript herausgekramt, welches ich für eine Forensoftware so abgeändert habe, dass es die Beiträge aus einem Thema in einem bestimmten Forum ausliest. - Es funktioniert auch. (auch diese ist im UTF8 format. Das bestätigt mir pspad und notepad++)

Rufe ich die Datei direkt auf (z.B. http://domain.de/news.php) wird auch alles korrekt angezeigt.

Sobald ich die Datei in meine index.php includiere, werden die Umlaute nicht mehr Ordnungsgemäß angezeigt.

Daher meine Verwirrung.
 
Guck mal im Firefox im Kontextmenü unter „View Page Info → General“, was bei den Seiten jeweils bei „Encoding“ steht.
 
Unter der Hauptseite (index.php) zeigt er mir UTF-8 an.

Bei der news.php zeigt er mir eine ISO-Variante an. Das verstehe ich nun echt nicht, warum er das macht, wenn es doch explizit als UTF-8 abgespeichert wurde :/
 
struppi schrieb:
Wenn du von einer HTML Seite redest, die du über http abrufst, dann ist der http header wichtig, nciht das was im HTML Code steht.

In the case of conflict between multiple encoding declarations, precedence rules apply to determine which declaration wins out. For XHTML and HTML, the precedence is as follows, with 1 being the highest.

1. HTTP Content-Type header
2. byte-order mark (BOM)
3. XML declaration
4. meta element
5. link charset attribute

- Declaring character encodings in HTML

Dein Server schickt standardmäßig einen Content-Type-Header mit, der ein bestimmtes – hardkodiertes – Encoding angibt.

Das kannst du auf dem Server einstellen.

- Für Apache etwa: Setting charset in htaccess

Meist ist es jedoch sinnvoller, in PHP den Header zu „überschreiben“.

PHP:
// Vor der ersten Ausgabe
header('Content-Type: text/html; charset=utf-8');

Schönes Tool:

- http://validator.w3.org/i18n-checker/
 
PHP selbst

Code:
Warning: Cannot modify header information - headers already sent by (output started at /home/maxpanbg/www.domain.de/index.php:14)
 
Du musst den header-Aufruf wie gesagt vor die erste Ausgabe (HTML-Code, echo, was auch immer) setzen. (Also, natürlich nicht genau davor, er muss nur eher erfolgen. Header können logischerweise nur dann modifiziert werden, wenn sie noch nicht weggeschickt wurden. Genau das passiert aber bei der ersten Ausgabe an den Client.)
 
PHP:
<?php

header('Content-Type: text/html; charset=UTF-8');

mysql_connect('localhost', 'user', 'passwort');
mysql_set_charset('utf8');
mysql_select_db('test');

$result = mysql_query("SELECT * FROM deine_tabelle ORDER BY id");

while ($row = mysql_fetch_assoc($result)) {
    var_dump($row);
}

Wenn du's so testest, kriegst du die Umlaute falsch dargestellt? Falls ja, als was?
 
Ok, jetzt "motzt" er nicht mehr rum, aber am Problem hat sich nichts geändert.
Wie sieht denn das Problem aus? Es wäre für uns sinnvoll zu wissen, was du siehst und was du erwartest.

Auch das du auf zwei Seiten verschiedene Zeichenkodierung hast, ist seltsam und nicht normal. Da jetzt an den Symptomen (wieder mal) rumzudoktern bringt nicht viel. Wir müßten Wissen, warum das so ist.
 
PHP:
<?php

header('Content-Type: text/html; charset=UTF-8');

mysql_connect('localhost', 'user', 'passwort');
mysql_set_charset('utf8');
mysql_select_db('test');

$result = mysql_query("SELECT * FROM deine_tabelle ORDER BY id");

while ($row = mysql_fetch_assoc($result)) {
    var_dump($row);
}

Wenn du's so testest, kriegst du die Umlaute falsch dargestellt? Falls ja, als was?

Hab das gerade mit meinem Script verknüpft. Funktioniert nicht.

Die Zeichen sehen so aus: �
 
Du hast die Collation in der Datenbank (beziehungsweise bei den Spalten) nachträglich auf UTF-8 geändert, als schon Daten in der Tabelle standen, richtig?

Edit: Nein, ich glaube, das ist Unsinn. Dein Eingabeformular ist noch ISO-8859-1?
 
Zuletzt bearbeitet:
Das ist ein ISO Zeichen, das in einer UTF 8 kodierten Seite dargestellt wird. D.h. du musst die Daten umwandeln. Entweder die ganze Daten oder bei jeden Zugriff.
Also hätte ich, gleich nach der Datenbankerstellung die Kollation der Datenbank auf utf-8_general_ci stellen müssen? Nachträglich funktioniert das nicht mehr?
 
Zurück
Oben