anna: Encoding: PHP <-> MySQL

hi ihr,

ich habe in meiner Datenbank Datensätze mit utf8_general_ci als encoding.
meine seit hat jedoch iso-8859-1 als charset und ich "kann" das nicht in utf-8 ändern.
wenn ein Wort mit umlaut aus der Datenbank über php in der Seite ausgebe wird es durch ein ? ersetzt.
Wie kann ich das Wort korrekt darstellen, ohne das charset der HTML Datei zu ändern?

Liebe Grüße, Anna

  1. Hallo Anna,

    ich habe in meiner Datenbank Datensätze mit utf8_general_ci als encoding.
    meine seit hat jedoch iso-8859-1 als charset und ich "kann" das nicht in utf-8 ändern.
    wenn ein Wort mit umlaut aus der Datenbank über php in der Seite ausgebe wird es durch ein ? ersetzt.
    Wie kann ich das Wort korrekt darstellen, ohne das charset der HTML Datei zu ändern?

    Die Funktion utf8_decode() sollte dir weiterhelfen. Beachte allerdings, dass ISO-8859-1 nicht alle Unicode-Zeichen beinhaltet, sodass es passieren kann, dass einige Zeichen nicht dargestellt werden können.

    Schöne Grüße,

    Johannes

  2. Ich glaube eher, dass der Verbindungszeichensatz falsch eingestellt ist. Der ist nämlich standardmäßig ISO-8859-1. Ich weiß nicht wie man den beim MySQL-Server einstellt, aber du kannst ihn auch per PHP ändern:

    mysql_connect(ip user pass);
    mysql_select_db(meine datenbank);

    mysql_query("SET NAMES 'UTF8'");

    UTF8 in der Query _ohne_ Bindestrich angeben.

    Gruß ldr

    1. Ignoriere meinen vorherigen Post, du willst ja ISO-8859-1 benutzen nicht UTF8 und nicht umgekehrt...

      Also:

      SET NAMES 'latin1'

  3. echo $begrüßung;

    ich habe in meiner Datenbank Datensätze mit utf8_general_ci als encoding.

    Einzelne Datensätze haben keine eigene Kodierung, aber für ein Feld kann eine bestimmte Kodierung eingestellt sein, die dann für alle Datensätze für dieses Feld gilt. Andere Felder können ihre eigene Kodierung haben. Aber das war vermutlich nur ein Formulierungsfehler.

    meine seit hat jedoch iso-8859-1 als charset und ich "kann" das nicht in utf-8 ändern.

    Das ist nicht besonders gut, denn mit UTF-8 kannst du praktisch jedes (Schrift-)Zeichen abbilden, mit ISO-8859-1 bzw. Latin1 nur derer 256.

    wenn ein Wort mit umlaut aus der Datenbank über php in der Seite ausgebe wird es durch ein ? ersetzt.

    Das kann als Ursache haben, dass das Zeichen bereits beim Einlesen in die Tabelle kaputtgegangen ist, weil MySQL auf der Verbindung UTF-8 erwartet hat, aber nur Latin1 bekommen hat.
    Es kann aber auch an anderer Stelle passiert sein, die UTF-8 erwartet hat, aber Latin1 bekam. Andersrum ist unwahrscheinlich, denn dann hättest du zwei andere Zeichen und nicht nur ein Fragezeichen.
    Und ich vermute auch, dass der Datenverlust nicht beim Auslesen entstanden ist. Denn wenn die Seite als ISO-8859-1 deklariert ist und UTF-8 bekäme gäbe es zwei andere Zeichen. Es kann aber auch sein, dass du einen HTTP-Header mit charset-Angabe sendest, der auf UTF-8 steht, denn der hätte Vorrang vor einem gleichnamigen Meta-Element in HTML.

    Prüfe zunächst mit phpMyAdmin deine Daten. Wenn sie damit richtig angezeigt werden, kann man davon ausgehen, dass sie in der Datenbank richtig stehen. Wenn nicht, musst du sie zuerst korrigieren, bevor du weitere Ausleseversuche anstellst, denn die werden nicht sehr erfolgreich sein, oder nur durch Zufall richtige Daten anzeigen.

    Wie kann ich das Wort korrekt darstellen, ohne das charset der HTML Datei zu ändern?

    Gesetzt den Fall, die Daten sind in der Datenbank richtig eingetragen, reicht es, wenn du für die Kodierung der Verbindung zum Client Latin1 einstellst, denn dann kodiert MySQL die Daten in den Feldern nach Latin1 um. Voraussetzung für eine fehlerfreie Umkodierung ist aber, dass das Zeichen überhaupt in Latin1 enthalten ist. Die Kodierung der aktuellen Client-Verbindung stellt man mit SET NAMES ein. Für Latin1 sieht das so aus:

    SET NAMES latin1

    Wenn du Zeichen jenseits von Latin1 verwendest, brauchst du Entities oder numerische Zeichenreferenzen (NCR) für diese Zeichen, damit du sie in ein HTML-Dokument bekommst. Das kann MySQL nicht bewerkstelligen. Dafür müsstest du die Verbindung auf UTF-8 laufen lassen (SET NAMES utf8) und in PHP mit htmlentities($daten, ENT_COMPAT, 'UTF-8') die Entities bzw. NCR erstellen.

    echo "$verabschiedung $name";