dedlfix: Immer wieder Zeichensätze

Beitrag lesen

Hi!

ich weiss, dass ich an unterschiedlichen Stellen Angaben zur Zeichenkodierung machen kann:

Ja, aber bitte nicht alles in einen Topf kippen. Es gilt immer zwei Systeme zu betrachten und die Verbindung zwischen beiden.

+----------+   +----------+   +----------+
| System 1 |---| System 2 |---| System 3 |
+----------+   +----------+   +----------+

System 1 kommuniziert mit System 2 und muss dabei die Zeichenkodierung angeben, in der es Daten sendet (oder beide müssen zufällig oder gezielt auf eine bestimmte konfiguriert sein).
System 3 interessiert noch nicht weiter. Das kommt erst dann ins Spiel, wenn System 2 mit ihm kommuniziert, dann aber ist System 1 aus dem Rennen.

Ein System muss beim internen Verarbeiten mit der Kodierung umgehen können oder aber nur als Durchreicher agieren. Beim internen Verarbeiten interessieren die anderen Systeme nicht, denn die sind ja zu der Zeit nicht beteiligt.

  1. Ich kann eine Angabe im Metatag machen

Die charset-Angabe im gleichnamigen HTTP-Header hat Vorrang vor der Meta-Element-Angabe. Wichtig ist, dass eine Angabe kommt, sonst rät der Browser.

  1. Ich kann einen Defaultwert über eine .htaccess festlegen.

Das ist eine Konfigurationsgeschichte, die dafür sorgt, dass eine charset-Angabe im HTTP-Header Content-Type enthalten ist, aber das ist nicht die einzige Stelle, die diese charset-Angabe beeinflussen kann ...

  1. Ich kann über php:header() ein Encoding festlegen.

.. denn auch darüber lässt sie sich setzen.

  1. Ich kann über phpmyadmin ein Encoding für die DB festlegen.

Die Verbindung zum DBMS ist eine eigene Geschichte, quasi Kommunikation zwischen System 1 und 2 und nicht zwischen 2 und 3, wenn wir mal annehmen, dass 1 das DBMS ist, 2 ist PHP und 3 der Browser. Genauer gesagt ist das in deinem Beispiel nur das DBMS und das auch nur ein Konfigurationswert. Denn die Kodierungs-/Kollationsangabe einer DB ist nur ein Defaultwert für neu angelegte Tabellen und der Wert einer Tabelle nur ein Defaultwert für deren Felder. Und das ist letzlich die eitscheidende Konfiguration für den in diesem Feld zu liegen kommenden Inhalt. Jedes Feld darüber hinaus eine eigene Einstellung haben. Bei der Kommunikation mit der Außenwelt spielt diese Einstellung nur in sofern eine Rolle, als dass die Daten von MySQL selbständig aus dieser Kodierung in die Kodierung auf der Verbindung umkodiert werden und umgekehrt. Bei der Kommunikation von und zum DBMS zählt also nicht die Feldeinstellung sondern das was auf der Verbindung ausgehandelt oder "defaultgewertet" wurde (Stichwörter: mysql(i)_set_charset() und SET NAMES).

  1. Ich kann neuerdings für eine Datei beim Abspeichern das Encoding festlegen.

Auch das ist wieder eine Sache, die nur ein einzelnes System betrifft. Und es ist auch keine neuerdings-Erfindung sondern war schon immer präsent. Einige Editoren können nur mit der vom System vorgegebenen Default-Kodierung umgehen, andere sind fähig, mehrere Kodierungen verarbeiten zu können.

ich habe die Erfahrung gemacht, dass wenn alles einheitlich als utf-8 angegeben wird, alles unproblematisch funktioniert.

Nun, es muss nur zwischen zwei Systemen einheitlich sein. Wenn System 1 und 3 unterschiedliche Kodierungen sprechen, muss System 2 übersetzen. Das geht prinzipbedingt nicht von jeder Kodierung in eine andere verlustfrei.

Die Erkenntnis 5) ist recht neu für mich seit ich nicht mehr mit Windows:Homesite sondert mit OS X:Coda arbeite.
Wie die Angaben von 1-5 miteinander konkurrieren und was sich wie überschreibt ist mir allerdings nicht klar.

Teilweise nicht direkt, wie du gesehen hast. Natürlich brauchst du einen Überblick über das Gesamtsystem, aber besonderes Augenmerk muss du auf die jeweiligen Teilstücks legen, sie mehr oder weniger isoliert vom Rest begutachten. Die Fragen sollten lauten: Ich habe Daten vom einem System bekommen, in welcher Kodierung liegen sie vor? (Wie) muss ich dem Sender sagen, welche Kodierung ich gern hätte? - Um die Daten zu einem anderen System zu senden, wie müssen sie dafür kodiert sein, und wie teilt man das dem Emfänger mit?

Eine XHTML-Site besteht aus:

  • dem XML-File 'index.php'
  • einem Stylesheet 'styles.css'
  • einer JS-Datei 'functions.js'
  • einer Grafik 'image.jpg'

Weiterhin wird in die 'index.php' per php:include() die
Datei 'include.inc.php' inkludiert. Dort wird:

  • eine DB-Connection aufgebaut.
  • und ein SQL-Statement abgesetzt.
  • das Result wird in Variablen geschrieben, die auf der index.php
    ausgegeben werden.

An welchen Stellen muss notwednigerweise das Encoding festgelegt werden ?

Versuch mal, diese Frage nun selbst zu beantworten.

Lo!