PHP-Troubleshooting - Fragen zu Zeichensätzen

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von Der_Jan, 29.12.2006.

  1. Der_Jan

    Der_Jan Thread Starter MacUser Mitglied

    Beiträge:
    606
    Zustimmungen:
    7
    MacUser seit:
    06.01.2004
    Moin,
    zwischen den Jahren ein paar Tage Urlaub - gute Zeit, um sich den aktuellen PHP-Herausforderung zu widmen. An den folgenden "Klippen" komme ich nicht weiter, evtl. hat ja einer einen Tipp für mich.

    Klippe 1: Ich möchte einen String überprüfen, ob in diesem nur Zeichen aus dem ASCII-Satz eingesetzt wurden. Kann ich das mit PHP realisieren?

    Klippe 2: Wenn ich einen Formular-Eintrag in die MySQL speichern möchte, werden Sonderzeichen entstellt, z.B. wird aus Würzburg Würzburg. Keine Idee, wie ich das unterbinden kann.

    Danke & Gruß
    Der Jan :)
     
  2. ThaHammer

    ThaHammer MacUser Mitglied

    Beiträge:
    3.276
    Zustimmungen:
    13
    MacUser seit:
    01.06.2004
    Stichwort: htmlentities
     
  3. Darkstar

    Darkstar MacUser Mitglied

    Beiträge:
    160
    Zustimmungen:
    0
    MacUser seit:
    17.07.2004
    Wenn die Umlaute oder Sonderzeichen auch schon so in der Datenbank abgespeichert sind, würde ich einen anderen Zeichensatz in der MySQL Datenbank verwenden. Nimm am besten "Latin1 general ci" oder "UTF-8 general ci" als MySQL Zeichensatz und setze den Zeichensatz Deiner Seiten wie folgt:
    Code:
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    Ich pers. würde htmlentities nur für die Ausgabe verwenden und die Daten nicht schon codiert in die Datenbank speichern. Das macht auch späteres Editieren über Formulare etc. angenehmer und erspart Dir einiges an Arbeit.

    Vielleicht hilft Dir das ja weiter.
     
  4. oneOeight

    oneOeight MacUser Mitglied

    Beiträge:
    46.831
    Zustimmungen:
    3.633
    MacUser seit:
    23.11.2004
    1. mb_detect_encoding hilft dir...

    2. ich würde direkt mit utf-8 arbeiten...
    also musst du deine html seite wie schon gesagt richtig mit meta tag versehen, die mysql verbindung auf utf8 setzen und eventuell auch den server auf utf8 laufen lassen...
     
  5. Der_Jan

    Der_Jan Thread Starter MacUser Mitglied

    Beiträge:
    606
    Zustimmungen:
    7
    MacUser seit:
    06.01.2004
    Ich glaube, ich muss die beiden Probleme nacheinander abarbeiten...:p

    Okay, also alles auf utf-8 umstellen. Um ehrlich zu sein, mich verwirrt das Zeichensatz-Thema immer gerne, deshalb noch mal nachgefragt: Was ist in der Praxis der eigentliche Unterschied zwischen

    Code:
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    und

    Code:
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    ?

    Gibst du mir einen Tipp, wo ich das umstellen kann?

    Danke!;)
    Der Jan
     
  6. 2nd

    2nd MacUser Mitglied

    Beiträge:
    8.902
    Zustimmungen:
    242
    MacUser seit:
    25.07.2004
    Also die Metatagangabe ist nur sinnvoll, wenn die Seiten ohne Server angeschaut werden sollen, sprich, man zieht ein HTML Dokument von der Platte in den Browser. Wenn ein Dokument vom Server angefordert wird, schickt der defaultmäßig trotzdem ein Latin1 im HTTP Header mit. Das änderst Du, indem Du per PHP ein

    vorne an das Dokument dranstellst. Oder Du hast Zugriff auf die Apache Config (http.conf) und baust da ein

    ein.

    Stichwort htmlentities: Ich würde die Umlaute nicht in der Datenbank als Entities speichern, Du bist damit nicht mehr medienneutral. Sollen die Inhalte für ein anderes Medium als einen HTML Parser ausgegeben werden, muss dann erst alles wieder umkodiert werden - lieber gleich als UTF-8 in der Datenbank speichern.

    Die Datenbankverbindung stellst Du mit einem "set names utf8" Query auf UTF-8 um. Dafür sollten aber auch die Tabellen als "UTF-8 general ci" angelegt sein. Ich mache das z. B. mit phpMyAdmin beim Anlegen neuer Tabellen (Kollation: UTF-8 general ci). Es wird jedoch empfohlen, nur entsprechende Spalten als UTF-8 anzulegen, die wirklich als UTF-8 gebraucht werden, also keine ganzen Tabellen, da die UTF-8 Zeichenkodierung immer mehr Speicher verbraucht als Latin1 als Charset.

    Hier ist noch ein lesenswerter MySQL Artikel bzgl. Zeichensätzen:

    http://blog.koehntopp.de/archives/1424-MySQL-Zeichensatz-Grundlagen.html

    2nd
     
    Zuletzt bearbeitet: 29.12.2006
  7. oneOeight

    oneOeight MacUser Mitglied

    Beiträge:
    46.831
    Zustimmungen:
    3.633
    MacUser seit:
    23.11.2004
    bist du da sicher?
    schliesslich speichert mysql seit 4.x die umlaute etc eh immer als utf-8...
     
  8. 2nd

    2nd MacUser Mitglied

    Beiträge:
    8.902
    Zustimmungen:
    242
    MacUser seit:
    25.07.2004
    Naja, wie das DBMS untendrunter arbeitet ist mir ja als Anwender erstmal egal. Die Kollationen der Tabellen/Spalten sind, soweit ich das überblicke, entscheidend. Und da brauche ich mit UTF-8 einfach mehr Speicher für ein Zeichen anstelle der 1-Byte Zeichensätze wie Latin1 z. B.. Das hat z. B. Konsequenzen für die Indexerstellung.

    Steht in dem Artikel, den ich oben verlinkt habe, gut erklärt. Wenn der Klick drauf nicht geht, einfach den Browser refreshen...

    2nd
     
  9. Der_Jan

    Der_Jan Thread Starter MacUser Mitglied

    Beiträge:
    606
    Zustimmungen:
    7
    MacUser seit:
    06.01.2004
    Habe die http.conf entsprechend geändert. Habe außerdem das Feld City in meiner MySQL-Tabelle auf utf8_unicode_ci umgestellt.

    [​IMG]

    Anschließend habe ich zur Probe einen neuen Datensatz per CMS eingegeben, als Ergebniss zeigt mir die MySQL dann

    [​IMG]

    an.
    Interessant finde ich, dass die Anzeige nur im phpmyadmin verhackstückt wird, die Datenbankausgabe auf der eigentlichen Internetseite sieht wieder gut aus. :confused:

    Wie spielt eigentlich die Einstellung des Browsers in diese Thematik hinein? Sollte ich, da ich nun die Verbindung auf UTF-8 umgestellt habe, die Textkodierung auch auf UTF-Unicode umstellen?

    Der_Jan
     
  10. 2nd

    2nd MacUser Mitglied

    Beiträge:
    8.902
    Zustimmungen:
    242
    MacUser seit:
    25.07.2004
    Du kannst den phpMyAdmin umstellen, dass er ebenfalls in UTF-8 Kodierung anzeigt. Geht auf der Startseite!

    Der Browser bekommt ja den UTF-8 HTTP-Header vom Apache, den Du eingestellt hast. Den Metatageintrag könntest Du Dir sparen, der HTTP-Header ist entscheidend. Die Metatageangabe mit dem Charset ist nur wichtig, wenn kein HTTP-Header gesendet wird, sprich die Seite von der lokalen Festplatte als HTML-Dokument direkt geöffnet wird.

    2nd
     
Die Seite wird geladen...

Diese Seite empfehlen