Verschiedene Sprachen darstellen?



  • Hi Leute,

    ich will unsere Webseite etwas umbauen. Bisher war es so, dass ich Inhalte (alles deutsche Texte) aus unserer Datenbank abgefragt habe und diese angezeigt wurden. Soweit kein Problem.

    Nun kommen neben deutschen Texten, aber auch noch türkische, russische und Spanische hinzu. Da weiß ich gar nicht, wie ich deren Zeichen darstellen soll.

    Wir haben eine MySQL Version > 4.1. Diese unterstützt ja mehrere Zeichensätze. Da fangen auch schon meine Fragen an. In der Tabelle werden die einzelnen Datensätze unterschiedliche Sprachen haben. Muss ich nun für jeden neuen Eintrag den Zeichensatz mit angeben? Wie geht sowas in MySQL?

    Reicht es beim Auslesen der Daten einfach aus, wenn ich in der ersten Zeile im HTML den Zeichensatz angebe und dann einfach die Daten aus der Datenbank lade und anzeige?

    Was ist wenn ich auf einer Seite eine russischen und einen türkischen Text anzeigen will?

    Im internet bin ich leider nicht fündig geworden und ich weiß das hier viele unter euch mehr Erfahrung haben als. Ich wäre euch dankbar, wenn Ihr mir zu meinen Fragen etwas sagen könnt, bzw. einige gute Quellen im Internet habt.

    Beste Grüße

    Philipp



  • Hallo Philipp,

    Die Thematik, die du ansprichst ist im Internet unter dem Namen Internationalisierung bekannt. Am besten lassen sich Ressourcen zu diesem Thema mit dem äquivalenten, englischen Begriff "internationalization" (kurz i18n; 18 für die Anzahl der Buchstaben zwischen i und n) finden.

    (Statt den üblichen quote-tags hab ich bold-tags verwendet um deinen Text zu zitieren; bin ein fauler Kerl 🙂 )

    Nun kommen neben deutschen Texten, aber auch noch türkische, russische und Spanische hinzu. Da weiß ich gar nicht, wie ich deren Zeichen darstellen soll.

    Für die Darstellung von Buchstaben aus exotischen Schriften anderer Sprachen ist zunächst mal der Browser verantwortlich, oder besser gesagt das Modul im Betriebssystem (Uniscribe bei Windows), das die Aufgabe hat komplexe Schriften zu rendern. Was du wissen möchtest, ist, wie man Zeichen verschiedener Sprachen in einer einheitlichen Kodierung speichern kann, ohne dass "Konflikte" auftreten. Diesem Problem widmete sich, Gott sei Dank, das Unicode Konsortium, die für die Entwicklung des Unicode Kodierungssystems verantwortlich sind (unter anderem auch für den Unicode Bidirectional Algorithm und den Unicode Collation Algorithm). Ein Zeichensatz für alle Schriften dieser Welt; einfach genial. Natürlich sind noch nicht alle Sprachen und deren Vielfalt an Buchstaben bzw. symbolischen Zeichen erfasst, aber das Unicode Konsortium ist stets damit beschäftigt das Zeichenrepertoire zu erweitern. Mach dir aber keine Sorgen, Unicode ist generell schon sehr ausgereift und kommt mit Sprachen wie Russisch, Türkisch und Spanisch mit Leichtigkeit klar. Ein verwandtes Thema sind ja Schriftarten (also Fonts), und da muss man auch aufpassen, dass man Fonts verwendet die Unicode-Zeichen unterstützen. Die gängigsten Schriftarten wie "Times New Roman", "Arial [Unicode]" und "Verdana" sollten mit den drei Sprachen, die du erwähnt hast, gut zurecht kommen.

    Wir haben eine MySQL Version > 4.1. Diese unterstützt ja mehrere Zeichensätze. Da fangen auch schon meine Fragen an. In der Tabelle werden die einzelnen Datensätze unterschiedliche Sprachen haben. Muss ich nun für jeden neuen Eintrag den Zeichensatz mit angeben? Wie geht sowas in MySQL?

    Es ist nicht möglich auf Datensatzebene die Kodierung einzustellen. MySQL erlaubt die Einstellung des Zeichensatzes nur auf Ebene der Datenbank, der Tabelle und der Verbindung zum Server. Theoretisch könntest du die Texte zwar binär in unterschiedlichen Kodierungen speichern, aber damit verzichtest du auf Sachen wie Volltextsuche, Sortierung und wer weiß was sonst noch. Außerdem müsstest du, wie du richtig erkannt hast, eine extra Spalte einführen, wo die Kodierung des Textes gespeichert wird. Vergiss das alles und verwende einfach überall UTF-8 als Kodierung.

    Reicht es beim Auslesen der Daten einfach aus, wenn ich in der ersten Zeile im HTML den Zeichensatz angebe und dann einfach die Daten aus der Datenbank lade und anzeige?

    Meistens schickt der Webserver die Information über die Kodierung des Dokuments im HTTP Header mit, was von den Browsern höher priorisiert wird als das entsprechende Metatag im Dokument. Das Metatag sollte aber trotzdem inkludiert sein, da ein Dokument ja auch offline betrachtet werden kann. In diesem Zusammenhang sei anzumerken, dass dieses Metatag an erster Stelle im <header> Bereich stehen sollte, weil Text schon im <title> Element vorkommen kann, und zu diesem Zeitpunkt wäre es günstig für die Anwendung zu wissen was es vor sich hat.
    Solltest du komplett auf Unicode umsteigen, dann empfiehlt es sich den Webserver so einzustellen, dass alle Seiten in UTF-8 serviert werden.

    Was ist wenn ich auf einer Seite eine russischen und einen türkischen Text anzeigen will?

    Nur möglich wenn beide Texte in Unicode kodiert wurden. Unicode ist für solche Aufgaben ein wahrer Segen; kann man nicht oft genug betonen.

    Im internet bin ich leider nicht fündig geworden und ich weiß das hier viele unter euch mehr Erfahrung haben als. Ich wäre euch dankbar, wenn Ihr mir zu meinen Fragen etwas sagen könnt, bzw. einige gute Quellen im Internet habt.

    Erste Anlaufstelle überhaupt: http://www.w3.org/International/ (W3C I18N Topic Index: http://www.w3.org/International/resource-index.html )

    Eine Seite mit allgemeinen Informationen über I18n, L10n etc.: http://www.i18nguy.com/



  • Hi Aziz,

    vielen dank für deine ausführliche antwort. das hilft mir auf jeden fall weiter. nur eine sache ist mir nicht ganz klar.

    MySQL erlaubt die Einstellung des Zeichensatzes nur auf Ebene der Datenbank, der Tabelle und der Verbindung zum Server.

    Was genau muss ich ändern. Schon wäre es, wenn ich auf einen Datenbankserver gewöhnliche Datenbanken haben kann oder auch eine Datenbank die komplett auf UTF8 umgestellt ist. Oder muss der ganze DB Server dann UTF8 umgestellt werden? Im phpmyadmin konnte ich keine Funktionalität finden um Tabellen oder Datenbanken auf UTF8 umzustellen.

    Beste Grüße

    Philipp



  • Hallo,

    PvdB schrieb:

    Was genau muss ich ändern. Schon wäre es, wenn ich auf einen Datenbankserver gewöhnliche Datenbanken haben kann oder auch eine Datenbank die komplett auf UTF8 umgestellt ist. Oder muss der ganze DB Server dann UTF8 umgestellt werden? Im phpmyadmin konnte ich keine Funktionalität finden um Tabellen oder Datenbanken auf UTF8 umzustellen.

    Ich hab mir wieder die Dokumentation von MySQL über Zeichensätze und Kollationen durchgelesen, um mein Wissen darüber wieder aufzufrischen und sicher zu gehen, dass ich weiß wovon ich spreche. Meine Behauptung über die Einstellungsmöglichkeiten waren zwar nicht inkorrekt, aber ein bisschen unvollständig. In MySQL kann man also auf insgesamt 6 Ebenen Zeichensätze (fortan ZS) und Kollationen angeben, und zwar auf:

    1. Serverebene
    2. Datenbankebene
    3. Tabellenebene
    4. Spaltenebene
      (Die 5. und 6. Ebene haben nur in der Kommunikation zwischen MySQL und dem Client eine Bedeutung.)
    5. Verbingungsebene
    6. Ebene der Queries

    In welcher Kodierung deine Daten gespeichert werden, wird nur von der Spaltenebene bestimmt. Man kann also mehrere Spalten mit unterschiedlichen Kodierungen in der selben Tabelle haben. Die Ebenen darüber spielen diesbezüglich nur in der Vererbung der Zeichensätze eine Rolle, falls man keinen ZS explizit definiert hat.
    Generell ausgedrückt: Wenn man bei der Erstellung einer Datenbank/Tabelle/Spalte keinen ZS angibt, dann wird der ZS in der jeweils darüberliegenden Ebene herangezogen um den ZS in der darunterliegenden Ebene zu bestimmen. Zum Beispiel: Füge ich eine neue Spalte zu einer Tabelle hinzu und definiere aber nicht explizit einen ZS, dann wird automatisch der ZS der Tabelle geerbt.

    Was Kollationen sind, bedarf einer kleinen Erklärung. Zeichensätze sind ja nichts weiter als eine "Zuweisungstabelle", in der jedes Zeichen ein Paar mit einem eindeutigen, binären Code bildet (einfaches Bsp.: A=0, B=1, C=2 etc.). In der Computerwelt wollen wir ja nicht nur Buchstaben, Symbole und Zahlen sehen können, sondern interessieren uns meistens auch für Suchmaschinen und alphabetisch sortierte Listen. Für diesen Zweck gibt es Kollationen, die sprachenabhängige Regeln bei Stringvergleichsoperationen (größer, kleiner, gleich, nicht gleich; case sensitive od. case insensitive) definieren.

    Der Grund warum du in phpMyAdmin den Zeichensatz nicht direkt bestimmen kannst, ist weil dies indirekt durch die Zuweisung einer Kollation geschieht. Kollationen hängen eng mit ihrem zugehörigen Zeichensatz zusammen, weshalb sie den Zeichensatznamen als Präfix in ihrem eigenen Namen tragen und nicht mit fremden Zeichensätzen kombiniert werden dürfen. Zum Beispiel: Zeichensatz = utf8, Kollation = utf8_bin, utf8_czech_ci,utf8_danish_ci etc. Wenn du also in phpMyAdmin eine Kollation wählst, dann ist implizit klar welcher Zeichensatz verwendet werden soll. Für jede Ebene (1,2,3 und 4) gilt, dass ein Zeichensatz und eine Kollation definiert sein muss, sie sind somit niemals NULL oder undefiniert. Nicht verwirrt sein: wenn du eine Tabelle erstellst und keinen ZS angibst, dann verstößt du nicht gegen diese Regel, es wird ja nämlich im Hintergrund die Vererbungsregel - wie oben bereits erläutert - angewandt.

    Dein erster Schritt ist nun, dass du eine Datenbank mit der Kollation utf8_general_ci anlegst. Ich gehe davon aus, dass du das über die Hauptseite von phpMyAdmin ohne Schwierigkeiten hinkriegst. Falls eine Datenbank bereits besteht, dann kannst du die Kollation über den "Operations"-Bereich ändern. Diese Änderung wird sich allerdings nicht auf die Tabellen und Spalten darin auswirken, da diese Ebenen ihre Kollationen bereits geerbt/zugewiesen bekommen haben, was nur einmal geschieht.

    Soviel mal dazu. Als nächstes musst du dich um die Kommunikation zwischen deiner Anwendung und dem MySQL-Server kümmern. Bei all dieser Einstellungsfreudigkeit hinsichtlich der Zeichensätze und Kollationen stellt sich die Frage: In welcher Kodierung muss nun der Datenaustausch zwischen Client und Server erfolgen? Im Manual wird auf diese Frage ausführlich eingegangen: Connection Character Sets and Collations

    Du kannst folgende Queries verwenden um zur Laufzeit zu bestimmen welchen Zeichensatz (und Kollation) du für die Kommunikation bevorzugst:

    //entweder
    SET NAMES utf8
    //oder
    SET CHARACTER SET utf8
    // Der Unterschied zwischen den beiden sei von der Dokumentation zu entnehmen (oben angegeben)
    

    Wenn du das nicht jedesmal machen willst dann musst du die entsprechenden Systemvariablen in der Konfigurationsdatei von MySQL ändern. Aber das bringt nicht viel wenn nicht alle deine Daten in deinen Datenbänken einen einheitlichen Zeichensatz haben.

    MfG,
    Aziz


Anmelden zum Antworten