Umgang mit Sonderzeichen in PHP-Skripten
Michi
- php
1 Andreas Korthaus0 Kermit0 Andreas Korthaus0 Michi0 Candid Dauth0 Kermit
0 dedlfix0 Michi
0 rob
Hallo,
auf meiner Seite gibts Eingabeformulare, in die natürlich auch Umlaute eingegeben werden können.
Wie frägt man - mal als Beispiel - ab, ob die dem Skript übergebene Zeile gleich "ü" war?
So was wie
if ($vorname == "ü")
...
funktioniert nicht.
In der URL-Zeile wird ü zu "%C3%BC", aber wenn ich auf "%C3%BC" abfrage, funktionierts auch nicht.
Wie kodiert man also Sonderzeichen in PHP?
MfG
Michi
Hallo!
Wie frägt man - mal als Beispiel - ab, ob die dem Skript übergebene Zeile gleich "ü" war?
So was wie
if ($vorname == "ü")
...funktioniert nicht.
Versuche es mal mit $_GET['vorname']
siehe auch: http://de3.php.net/manual/de/security.globals.php
In der URL-Zeile wird ü zu "%C3%BC",
bei mir nicht, bei mir bedeutet das =¼
Aber PHP kümmert sich schon von alleine darum die URL-Paramter zu dekodieren.
aber wenn ich auf "%C3%BC" abfrage, funktionierts auch nicht.
Weil es wie gesagt in PHP in der Form nicht mehr existiert.
Wie kodiert man also Sonderzeichen in PHP?
Wenn Du es manuell kodieren/dekidieren willst, kannst Du die urlencode/urldecode Funktionen verwenden. Aber das brauchst Du nicht wenn Du per $_GET auf URL-Parameter zugreifen willst.
Grüße
Andreas
if ($vorname == "ü")
...funktioniert nicht.
Wenn ein erwarteter Vergleich mit einer Variable aus unerklärlichen Gründen nicht funktioniert, sollte grundsätzlich der erste Ansatz sein, den Inhalt der Variablen auszugeben.
In der URL-Zeile wird ü zu "%C3%BC", aber wenn ich auf "%C3%BC" abfrage, funktionierts auch nicht.
Nein, was in der URL als %+Hexwert erscheint, wird vom Webserver automatisch in einen entsprechenden Bytewert umgesetzt, in diesem Fall 0xC3 gefolgt von 0xBC. Es liegt dann am Webserver, diese Bytefolge richtig zu dekodieren. Da der Webserver aber nicht wirklich wissen kann, welchen Zeichensatz der Browser für die Kodierung benutzt hat, funktioniert das nicht immer.
Probiere es mit ü, das sind die beiden Buchstaben, die in der ISO-8859-1-Tabelle für die zwei Bytewerte stehen, die wiederum der Browser für das ü aus der Unicode-Tabelle gezogen hat.
Wie kodiert man also Sonderzeichen in PHP?
Das ist nicht das Problem, du musst die Zeichen so kodieren, wie sie vom Browser gesendet und von Webserver und PHP empfangen werden.
Leider hast du bei URL-Parametern weder auf das eine, noch auf das andere Einfluss. Benutze also besser POST-Formulare mit dem Attribut accept-charset, so wie diese Forumssoftware es auch macht.
Hi!
Probiere es mit ü,
stimmt, hatte ich mich mit dem ersten Wert etwas verguckt ;-)
Das ist nicht das Problem, du musst die Zeichen so kodieren, wie sie vom Browser gesendet und von Webserver und PHP empfangen werden.
Leider hast du bei URL-Parametern weder auf das eine, noch auf das andere Einfluss. Benutze also besser POST-Formulare mit dem Attribut accept-charset, so wie diese Forumssoftware es auch macht.
Hängt die Kodierung der URL-Parameter nicht auch mit dem Charset der Seite zusammen? Ich würde jedenfalls solche Umlaute ebenfalls nicht per GET übertragen.
Grüße
Andreas
Hi!
Probiere es mit ü,
Ah, das klappt. ;)
Ok, hab mal das Formular um "accept-charset="ISO-8859-1"" erweitert.
Welche ist die Standard-Seite für diese ISO-Werte? (wie eben z.B. "ü" für "ü")?
MfG
Michi
Heißa, Michi,
Ok, hab mal das Formular um "accept-charset="ISO-8859-1"" erweitert.
Achtung, einige Browser halten sich nicht daran. Bei mir hat zum Beispiel der Internet Explorer _immer_ im Charset der Seite selbst gesandt.
Gautera!
Grüße aus Biberach Riss,
Candid Dauth
Welche ist die Standard-Seite für diese ISO-Werte? (wie eben z.B. "ü" für "ü")?
ü ist das Ergebnis aus drei Dingen: dem Unicode-Wert für ü (http://www.unicode.org/charts/PDF/U0080.pdf, hex FC, dezimal 252), der utf-8-Kodierung dieses Wertes (http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8, hex C3 BC, dezimal 195 188) und der Darstellung dieser beiden Bytes mittels ISO-8859-1 (http://de.selfhtml.org/inter/zeichensaetze.htm#iso8859_liste, 195 = Ã, 188 = ¼).
US-ASCII ist ein 7-Bit-Zeichensatz (128 mögliche Zeichen) und die Basis für alle ISO-8859-x-Zeichensätze sowie Unicode (http://www.unicode.org/charts/, Tabelle "Basic Latin"). Die Werte von 0 bis 127 und ihre Zeichen sind also in allen diesen Zeichensätzen identisch.
ISO-8859-1 ist weltweiter Quasi-Standard, umfasst westeuropäische Zeichen (mit Ausnahme des €) und ist die erweiterte Basis von Unicode (Tabelle "Latin-1"). Die Werte von 128 bis 255 und ihre Zeichen sind also in diesen beiden Zeichensätzen identisch.
utf-8 ist eigentlich kein Zeichensatz, sondern eine Methode, um die prinzipiell aus vier Bytes bestehenden Unicode-Werte kompatibel zu herkömmlichen, auf Ein-Byte-Zeichen ausgerichteten Programmen zu machen. Kompatibel bedeutet nur, dass herkömmliche Programme keine Bytes verschlucken, korrekt darstellen lassen sich die Zeichen nicht (stattdessen kommen halt Dinge wie ü heraus, die aber von utf-8-fähigen Programmen korrekt, in diesem Fall als ü, darstellt werden).
Um in PHP wenigstens aus ISO-8859-1 utf-8-kodierte Texte zu machen, kannst du die Funktion utf8_encode() benutzen. Beachte, dass diese Funktion nur mit echten ISO-8859-1-Zeichen funktioniert, Windows benutzt eine Erweiterung von ISO-8859-1 (windows-1252, http://www.microsoft.com/globaldev/reference/sbcs/1252.mspx, Erweiterungen erkennbar an Unicode-Werten > 00FF), so dass einige Zeichen mit utf8_encode() nicht oder falsch (Euro-Symbol) übersetzt werden.
echo $begrüßung;
Wie kodiert man also Sonderzeichen in PHP?
Das ist nicht das Problem, du musst die Zeichen so kodieren, wie sie vom Browser gesendet und von Webserver und PHP empfangen werden.
Leider hast du bei URL-Parametern weder auf das eine, noch auf das andere Einfluss.
Dieser Artikel http://dev.mysql.com/tech-resources/articles/4.1/unicode.html aus der MySQL-Dokumentation führt im unteren Teil eine Methode auf, das verwendete Charset zu erraten.
echo "$verabschiedung $name";
Hi,
Probiere es mit ü, das sind die beiden Buchstaben, die in der
ISO-8859-1-Tabelle für die zwei Bytewerte stehen, die wiederum der
Browser für das ü aus der Unicode-Tabelle gezogen hat.
Auf welcher Seite findet man die Standard-Tabelle in dieser Form?
Hab schon ein paar mit Hex-Werten usw. gefunden, aber keine mit ASCII-Zeichen wie oben.
MfG
Michi
Hi!
So was wie
if ($vorname == "ü")
funktioniert nicht.
hmm. vielleicht handelt es sich hier auch um ein ganz anderes Problem und nicht um irgendeine Kodierung.
Sicher, daß deine Variable $vorname heißt und nicht vielleicht $_POST['vorname'] oder $_GET['vorname'] heissen sollte..?
Nur so'n Gedanke...
Gruß, rob