PHP-Troubleshooting - Fragen zu Zeichensätzen

Der_Jan

Der_Jan

Aktives Mitglied
Thread Starter
Dabei seit
06.01.2004
Beiträge
712
Reaktionspunkte
30
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 :)
 
Stichwort: htmlentities
 
Der_Jan schrieb:
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.
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.
 
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...
 
Ich glaube, ich muss die beiden Probleme nacheinander abarbeiten...:p

oneOeight schrieb:
ich würde direkt mit utf-8 arbeiten...
also musst du deine html seite wie schon gesagt richtig mit meta tag versehen, ...

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" />
?

oneOeight schrieb:
... mysql verbindung auf utf8 setzen...

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

Danke!;)
Der Jan
 
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

header('content-type: text/html; charset=utf-8');

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

AddDefaultCharset utf-8

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:
2ndreality schrieb:
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.

bist du da sicher?
schliesslich speichert mysql seit 4.x die umlaute etc eh immer als utf-8...
 
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
 
2ndreality schrieb:
... Oder Du hast Zugriff auf die Apache Config (http.conf) und baust da ein ... ein.

Habe die http.conf entsprechend geändert. Habe außerdem das Feld City in meiner MySQL-Tabelle auf utf8_unicode_ci umgestellt.

macuser_phpmyadmin.png


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

macuser_wuerzburg.png


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
 
Der_Jan schrieb:
Interessant finde ich, dass die Anzeige nur im phpmyadmin verhackstückt wird, die Datenbankausgabe auf der eigentlichen Internetseite sieht wieder gut aus.

Du kannst den phpMyAdmin umstellen, dass er ebenfalls in UTF-8 Kodierung anzeigt. Geht auf der Startseite!

Der_Jan schrieb:
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 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
 
Zurück
Oben Unten