Charset und Sonderzeichen - Auf was muss man achten?
-
Hi!
Wenn ich ö, ü, ä, [, $, % ... Zeichen auf einer Website anzeigen will, muss ich dann zwingend den HTML Code verwenden, oder kann ich ein meta-charset angeben? Wenn ich zB. ISO-8859-1 angebe, muss ich dann nicht Codieren?
Bei mir werden zB. Umlaute unabhängig vom charset, auch wenn ich keines angebe, immer korrekt dargestellt, in vier verschiedenen Browsern.
Kapier ich nicht, wozu dann die Codes?Danke!
MfG
-
Es gibt keinen rationalen Grund, auf einer Webseite heutzutage nicht konsequent Unicode zu verwenden. Charsets und Umlaut-Entities sind "sowas von" angestaubt
Ansonsten, gibst du den korrekten Zeichensatz an, müssen die Umlaute natürlich nicht maskiert werden. Aber wie gesagt, das würde ich mir generell nicht mehr antun ... UTF-8 und gut ist.
-
UTF-8 ist doch auch ein Zeichensatz.
Also den nehme ich und hab keine Probleme, oder wie?
Und nix muss maskiert werden...Und in meiner Datenbank soll ich dann jede Tabelle mit Text auf uft8_unicode_ci oder utf8_bin umstellen (Gästebuch, ...)?
-
Also, auf die Schnelle fand ich:
Für deutschsprachige Webseiten ist ISO-8859-1 der richtige Zeichensatz.
Nun, UTF-8 findet man öfters bei amerikanischen Seiten wohingegen ISO-8859-1 bzw. ISO-8859-15 bei europäischen Seiten verwendet wird. Kann aber auch daran liegen, dass ö, ä, ü bei UTF-8 nicht korrekt (für uns) dargestellt wird.
-
Ja und ja, und den Blödsinn, den du dir da ergoogelt hast, vergisst du am besten ganz schnell wieder
Es ist natürlich klar, dass wenn du eine Seite in Latin9 abspeicherst und die dann als Unicode an einen Browser schickst, dieser mit Non-ASCII-Zeichen Probleme bekommt. Wenn du die Seite aber als UTF-8 speicherst und sie auch so sendest, gehört das Zeichenchaos komplett der Vergangenheit hat.
Unicode ist für jede Sprache der richtige Zeichensatz, das ist ja gerade der Sinn dabei
EDIT:
Oh, und vergiss nicht, bei der Datenbank nicht nur die Collation der einzelnen Tabellenfelder auf Unicode zu stellen, sondern auch die Verbindung an sich! In MySQL geht das mitSET NAMES 'utf-8'
.
-
Ok super, Unicode, ich komme!
Ach, was meinst du mit "die Verbindung an sich?" Die Datenbank-Kollation? Die Tabellen-Kollation?
Oder wann und wie müsste ich SET NAMES verwenden? Einmalig, zur Konvertierung? Dann würde ich gleich alles neu anlegen, bin eh erst bei der Entwicklung der Website.
-
Nein, du schaltest damit die Verbindung selbst (im Endeffekt den Transfer zwischen PHP und MySQL) auf Unicode um. Sprich, das solltest du jedes Mal als Erstes machen, wenn du eine Verbindung (mysql_connect) zum Daemon aufbaust.
Das SET NAMES verpackst du einfach in einen normalen Query (sprich mysql_query oder noch besser mysql_unbuffered_query).
Falls du andere Schnittstellen zur Datenbank benutzt (z.B. die objektorientierte), musst du natürlich entsprechend die Funktionsaufrufe anpassen
Sprich:
1. Kollation jedes TEXT-Feldes und Artverwandte auf Unicode stellen.
2. Nach jedem Connect zum Daemon die Verbindung auf Unicode stellen (SET NAMES).Dann sollte es soweit problemlos funktionieren!
-
Ok super, danke dir!
In meinem Fall wäre das dann wohl...
$pdo = new [b]PDO[/b]( 'mysql:host=mysql.example.com;dbname=example_db', "username", "password", [b]array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")[/b]);
-
Wie ist das dann eigentlich in PHP?
Kann ich .ini-Dateien, welche ich mit parse_ini_file() lade, auch in UTF-8 abspeichern?
Sind die erhaltenen Strings dann Unicode?
Kann ich generell ANSI und UNICODE-Strings ohne Probleme mischen?
Muss ich da etwas spezielles angeben/beachten?In C++ wäre das ja ordentlich Gefrickel...
-
Was ist da jetzt los?
Ich schreibe unmaskiert ein 'Ž' auf eine Seite, der Browser zeigt mir aber "Ž" an.
Die Seite ist aber "UTF-8 without BOM" codiert und im <head> steht ein <meta.. mit charset=utf-8...
-
Aha, anscheinend muss ich zusätzlich noch...
header("Content-type: text/html; charset=utf-8");
...schreiben.
Warum eigentlich? Hab ich doch im <meta>-Tag schon.Ach, und soll ich dann auch...
mb_language('uni'); mb_internal_encoding('UTF-8');
...schreiben?
Und muss ich dann andere string/regex Funktionen verwenden (die mit mb_..)?
Ich finde das schon sehr kompliziert, gerade wenn man keine Ahnung hat. Wie kann ich sicherstellen, dass ich da nichts falsch mache?
-
Hi,
die Angabe in <meta>-Tag interessiert die meisten Browser nicht die Bohne, das im HTTP-Header angegebene Charset ist entscheidend. Deshalb die Header-Funktion.
Die .ini-Dateien von PHP haben damit überhaupt nichts zu tun.
ASCII ist zu UTF-8 kompatibel (sprich, die ASCII-Zeichen haben gleiche numerische Werte im UTF-8).
Wenn du mit der mbstring-Erweiterung arbeiten willst, ja, dann musst du der natürlich auch mitteilen, dass du Unicode verwendest
Ich habe mir dafür recht flott eine eigene Stringklasse geschrieben, geht in einer halben Stunde recht schnell von der Hand und dann hast du auch keine Probleme mehr, alles ganz intuitiv. Musst halt die meisten String-Funktionen in PHP durch die mbstring-Funktionen oder Regex mit Unicode-Flag ersetzen.Unicode mit PHP ist durchaus eine halbe Katastrophe, aber wenn man sich ein wenig eingearbeitet hat eigentlich ganz problemlos möglich. Und ob du nun jeden Eingabestring auf einen kleinen Bereich von Sonderzeichen parst, die du dann durch Entities ersetzt, oder dir kurz eine Klasse von Stringfunktionen schreibst die mbstring- sowie Regex-Aufrufe kapselt und du deine Strings dann 1:1 übernehmen kannst, das bleibt sich vom Aufwand ungefähr gleich.
Übrigens wieder ein Beispiel dafür, warum ich (entgegen gewisser anderer Leute hier im Forum) sage: PHP ist nicht leicht! Die Syntax bereitet keine Probleme, aber die Anwendung in der Praxis hält so einige Fallstricke parat.
-
Naja, ohne Unicode ging alles ganz einfach...
Ich mochte Unicode noch nie. Einfach, weil die Leute anscheinend zu faul sind, ordentliche Standards zu schreiben, und sie dann aber auch überall und vollständig zu unterstützen.Ich bin eh erst am Anfang der Entwicklung, beim Grundgerüst. Habe gerade erst mit einem Accountsystem begonnen.
Von daher werde ich einfach gegen die mb_ Funktionen austauschen.Ich kann dann also weiterhin zB. preg_match verwenden, muss dann aber noch ein 'u' anhängen, ja? Und es gehen auch mehrere Optionen, zB. .../iu (Case-insensitive und Unicode)?
Warum nicht mb_ereg usw... (Da funktioniert übrigens kein Delimiter, warum das?)?Ach, und was meinst du damit:
árn[y]ék schrieb:
Und ob du nun jeden Eingabestring auf einen kleinen Bereich von Sonderzeichen parst, die du dann durch Entities ersetz, ...
-
Hi,
naja, deine Ausgangsfrage war ja, ob du Entities verwenden musst. Bei multilingualen Webseiten wärst du mit Latin9 als Zeichensatz früher oder später immer in der Problematik, entweder einige Sonderzeichen als Entities maskieren zu müssen, oder Zeichen darstellen zu wollen, die im Zeichensatz schlichtweg nicht enthalten sind. Ich denke nur mal an verschiedene Formen von Anführungszeichen, Währungssymbole, kompliziertere Akzente ...
Die preg-Funktionen kannst du mit dem Parameter u völlig problemlos verwenden. Auch Kombinationen sind ohne Weiteres möglich ereg würde ich allgemein nicht verwenden, entsprechend auch keine mbstring-Regex-Funktionen (wobei ich mit Letzteren nie gearbeitet habe). Da gab es mal eine genauere Ausführung drüber, aber die genauen Gründe habe ich gerade leider nicht mehr in Erinnerung. Auf jeden Fall ist preg ereg vorzuziehen ...
Wenn du aber gerade erst beim Lernen der Sprache bist, dann solltest du dich um Unicode in der Tat erst einmal nicht so intensiv kümmern. Das macht vieles unnötig komplizierter.
-
Habe schon paar Jahre Erfahrung mit C++ und PHP.
Allerdings möchte ich überall ganz genau wissen, was ich tue. Ich hasse es, Code zu schreiben, bei dem ich mir nicht vollkommen sicher sein kann, dass er so funktioniert, wie ich es vorsehe.
"Kümmern" muss ich mich darum. Ich möchte halt eine anständige Website erstellen, in der englischer, deutscher und tschechischer Text angezeigt werden soll.
-
Ach, noch was:
Ich kann auch die Kollation der Datenbank und Tabelle setzen, nicht nur die von einzelnen Feldern.
Was bringt das denn?
Und beim erstellen der Datenbank kann ich "Zeichensatz / Kollation der MySQL-Verbindung:" wählen.
Wenn ich da utf8 nehme, muss ich dann kein "SET NAMES 'utf8'" mehr machen?Danke!
MfG