Moin!
Fein, will heißen: das utf-8-"ä" besteht aus 16 Bit, in 8Bit/Latin1/iso-8859-1 werden die 16 Bit als zwei mal 8-Bit verstanden.
Ja und nein - deine Formulierung deutet an, dass du zwar wörtlich das Richtige sagst, aber dahinterstehend noch das Falsche verstehst.
Ein "ü" besteht in UTF-8 aus zwei Byte (= 2*8 Bit = 16 Bit), korrekt. Weil das das Ergebnis der Vorschrift ist, wie man den Unicode-Codepoint des "ü" in Bytes umzusetzen hat.
Und richtig ist auch, dass die Interpretation dieser zwei Bytes in ISO-8859-1 zu zwei Zeichen führt, die mit dem Original-"ü" nicht so wahnsinnig viel gemein haben.
Allerdings gibt es zwei Arten, wie man im Editor die Codierung der Zeichen "umschalten" kann. Der eine Fall, den du gerade siehst, ist diese: Der Editor liest die Bytes, und kriegt gesagt, nach welcher Vorschrift er die Bytes als Buchstaben auffassen soll. Änderst du die Vorschrift, dann ändert sich die Buchstabenanzeige, aber nicht die Bytes in der Datei.
Die alternative Methode ist, dass der Editor beim Umschalten den Buchstaben, der laut Vorschrift beim Lesen der Datei interpretiert wurde, beibehält, aber die Bytes ändert, weil für die andere Codiervorschrift eben andere Bytes notwendig sind, um dasselbe Zeichen darzustellen. Beim Speichern würde die Datei dann verändert werden.
Und umgekehrt? Fasst utf8 dann immer zwei Zeichen zusammen?
UTF-8 nutzt variabel viele Bytes, um ein Zeichen darzustellen. Es beginnt bei 1 Byte, und geht bis hin zu vier Bytes. Durch die geschickte Wahl der Codierung kann man jedem Byte ansehen, ob es für sich alleine steht, oder zu einem Multibyte-Zeichen gehört. Hat man es mit einem Multibyte-Zeichen zu tun, kann man feststellen, ob es das erste Zeichen einer Sequenz ist, oder eines der Folgezeichen. Hat man es mit einem Folgezeichen zu tun, befindet sich das erste Zeichen der Sequenz immer ein paar Bytes weiter vorne in der Bytefolge. Und das erste Zeichen einer Sequenz liefert immer die Anzahl der Folgebytes, die noch zu diesem Zeichen gehören, mit.
Um's mal konkret zu machen:
Ist das höchste Bit eines Bytes nicht gesetzt, handelt es sich um ein 1-Byte-UTF-8-Zeichen, das praktischerweise identisch ist mit den 7-Bit-ASCII-Zeichen.
Ist das höchste Bit gesetzt, handelt es sich um ein Byte eines Mehrbyte-Zeichens. Ist das zweithöchste Bit nicht gesetzt (also 10xx xxxx), handelt es sich um ein Folgebyte. Ist das zweithöchste Bit gesetzt (11xx xxxx), handelt es sich um das erste Byte eines Mehrbyte-Zeichens - wobei durch die Anzahl der hochwertigen 1-Bits definiert ist, wieviele Folgebytes noch kommen. Bei 110x xxxx kommt beispielsweise noch 1 Folgebyte (insgesamt 2 Bytes = 16 Bit), bei 1110 xxxx kommen zwei (insgesamt 3 Byte = 24 Bit), 1111 0xxx folgen noch drei Bytes (insgesamt 4 Byte = 32 Bit).
Siehe auch http://de.wikipedia.org/wiki/UTF-8.
Und wie ist es definiert, wenn nur 8bit in einer Zeile stehen? Absatz 8Bit-"ä" Absatz?
Der "Absatz" ist natürlich auch ein Zeichen, das als Byte codiert in der Datei steht. Es gibt in diesem Sinne also kein "Absätze" mit Zeichen als Bytes und Zeilenumbrüchen als ... nunja, was sollte man denn nutzen, um ohne Bytes einen Zeilenumbruch in eine Datei zu schreiben.
In deinem Betrachtungsfall hast du also drei Bytes:
1. Absatz-Byte.
2. "ä"-Byte.
3. Absatz-Byte.
Das sind drei Bytes, die entsprechend der Regeln der Codierung betrachtet werden müssen. Wählst du ISO-8859-1, und das "ä" ist gemäß dieser Vorschrift codiert, wirst du ein vernünftiges "ä" sehen.
Wählst du UTF-8, und das "ä" ist dennoch laut ISO-8859-1 codiert, wirst du anstelle des "ä" ein Kästchen oder Fragezeichen als Indikator für "fehlerhaftes oder nicht darstellbares Zeichen" erhalten, weil das "ä"-Bytes das höchstwertige Bit gesetzt hat, von UTF-8 also als Mehrbyte-Zeichen betrachtet wird - das nachfolgende Absatz-Byte aber hat das höchstwertige Bit nicht gesetzt, also kann festgestellt werden, dass hier ein UTF-8-Fehler ist.
Alternativ kann es aber auch passieren, dass gemäß der Bit-Angabe des "ä"-Bytes einfach alle nachfolgenden Bytes als zugehörig zu diesem Multibyte-Zeichen gerechnet werden - und im Editor einfach verschwinden. Das Resultat ist dann, dass weder das (natürlich fehlerhafte und deshalb nicht darstellbare) Multibyte-Zeichen, noch die diesem Zeichen fälschlich zugerechneten Nachfolgezeichen dargestellt werden - es wird einfach ein Stückchen Text verschluckt, und der Editor wird vermutlich nach dem Ändern des Textes und beim Speichern das fehlerhafte UTF-8-Zeichen inklusive aller verschluckten Bytes herausfiltern und nicht wieder in die Datei schreiben.
Deshalb ist es immer extrem wichtig, dass man festlegt und mit angibt, nach welcher Codierungsvorschrift die Bytes eines Textes zu interpretieren sind. Leider bietet das lokale Dateisystem für nackte Textdateien keinen guten Ort, diese Information zu speichern - man muß es sich also irgendwie separat merken oder grundsätzlich nur eine einzige Codierung verwenden. Aber immerhin kann man in HTML-Dateien ein passendes <meta>-Element einfügen - und im Netz liefert HTTP diese Zusatzinformation in der Regel mit.
- Sven Rautenberg
"Love your nation - respect the others."