# CESU-8

CESU-8 (kurz für Compatibility Encoding Scheme for UTF-16: 8-Bit) ist eine Variante von UTF-8, die im Unicode Technical Report #26 beschrieben wird. Der Codepoint wird zunächst in UTF-16 ausgedrückt, dann wird das Ergebnis in UTF-8 rekodiert, als wäre es UCS-2.

## Kodierung

CESU-8-kodierter Text entsteht, wenn bei der Kodierung nach UTF-8 eine etwaige UTF-16-Kodierung der Ausgangsdaten nicht berücksichtigt wird, sei es aus Unkenntnis oder weil der Programmcode noch aus der Zeit stammt, in der Unicode nur ein 16-Bit-Zeichensatz war.
Bei Zeichen aus dem Bereich der Basic Multilingual Plane (Zeichen bis Nummer 65.535) sind UTF-8 und CESU-8 identisch. Zeichen außerhalb der BMP werden durch die UTF-16-Kodierung durch jeweils zwei 16-Bit-Werte (aus dem für diese Zwecke reservierten Bereich von D800$_{hex}$ bis DFFF$_{hex}$) repräsentiert. Werden diese beiden Werte nun einzeln in UTF-8 umgewandelt, entstehen daraus jeweils 3-Byte-Sequenzen aus dem Bereich ED A0 xx … ED BF xx, welche in normalem UTF-8 nicht vorkommen können. Ein korrekter UTF-8-Kodierer muss dagegen zuerst die UTF-16-Kodierung der Eingangsdaten erkennen und dekodieren (wobei Code-Werte >65535 auftreten können) und anschließend erst die UTF-8-Kodierung durchführen, wobei Werte >65535 in 4-Byte-Sequenzen kodiert werden, die mit F0$_{hex}$ bis F4$_{hex}$ beginnen.

## Verwendung

Da diese eigentlich „falsche UTF-8-Kodierung“ eine gewisse Verbreitung gefunden hat, wurde sie nachträglich durch das Unicode-Consortium genormt, allerdings unter dem neuen Namen CESU-8. CESU-8 wird ausdrücklich nicht als Datenaustauschformat empfohlen, sondern nur als internes Format, wenn eine Kompatibilität zu UTF-16 erforderlich ist.
CESU-8 wird z. B. von der Oracle-Datenbank-Software verwendet: Mit Version 8 wurde ein "UTF8" genannter Zeichensatz eingeführt, der aber in Wirklichkeit der CESU-8-Kodierung entspricht. Mit Version 9.0 wurde ein korrekter UTF-8-Zeichenatz eingeführt, der allerdings den Namen "AL32UTF8" erhielt, um die Kompatibilität zu vorhandenen, älteren Datenbanken zu bewahren.

## Beispiel

| Kodierung | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point | Unicode code point |
| Kodierung | U+0045 | U+0205 | U+0205 | U+10400 | U+10400 | U+10400 | U+10400 | U+10400 | U+10400 | U+10400 | U+10400 | U+10400 | U+10400 | U+10400 | U+10400 |
| UTF-8 | 45 | C8 | 85 | F0 | F0 | F0 | 90 | 90 | 90 | 90 | 90 | 90 | 80 | 80 | 80 |
| UTF-16 | 0045 | 0205 | 0205 | D801 | D801 | D801 | D801 | D801 | D801 | DC00 | DC00 | DC00 | DC00 | DC00 | DC00 |
| CESU-8 | 45 | C8 | 85 | ED | ED | A0 | A0 | 81 | 81 | ED | ED | B0 | B0 | 80 | 80 |

## Gleiches Beispiel mit Binärdarstellung

| Kodierung | Kodierung | Hexadezimal | Binär | Unicode code point |
| UTF-8 | UTF-8 | 45 | 0100 0101 | U+0045 (E, Lateinischer Großbuchstabe E) |
| UTF-16 | UTF-16 | 00 45 | 0000 0000 0100 0101 | U+0045 (E, Lateinischer Großbuchstabe E) |
| CESU-8 | CESU-8 | 45 | 0100 0101 | U+0045 (E, Lateinischer Großbuchstabe E) |
| UTF-8 | UTF-8 | C8 85 | 1100 1000 1000 0101 | U+0205 (ȅ, Lateinischer Kleinbuchstabe E mit Doppelgravis) |
| UTF-16 | UTF-16 | 02 05 | 0000 0010 0000 0101 | U+0205 (ȅ, Lateinischer Kleinbuchstabe E mit Doppelgravis) |
| CESU-8 | CESU-8 | C8 85 | 1100 1000 1000 0101 | U+0205 (ȅ, Lateinischer Kleinbuchstabe E mit Doppelgravis) |
| UTF-8 | UTF-8 | F0 90 90 80 | 1111 0000 1001 0000 1001 0000 1000 0000 | U+10400 (𐐀, Deseret-Großbuchstabe langes I) |
| UTF-16 | High-Surrogate | D8 01 | 1101 1000 0000 0001 | U+10400 (𐐀, Deseret-Großbuchstabe langes I) |
| UTF-16 | Low-Surrogate | DC 00 | 1101 1100 0000 0000 | U+10400 (𐐀, Deseret-Großbuchstabe langes I) |
| CESU-8 | High | ED A0 81 | 1110 1101 1010 0000 1000 0001 | U+10400 (𐐀, Deseret-Großbuchstabe langes I) |
| CESU-8 | Low | ED B0 80 | 1110 1101 1011 0000 1000 0000 | U+10400 (𐐀, Deseret-Großbuchstabe langes I) |
Legende :
| 0100 0101 etc. | Datenbits |
| 10000$_{hex}$ | Größe der Ebene 0: Basic Multilingual Plane (wird für die UTF-16 Codierung abgezogen) |
| 110110 | UTF-16 High-Surrogate Kodierungsbits |
| 110111 | UTF-16 Low-Surrogate Kodierungsbits |
| 110, 1110, 11110, 10 | UTF-8 Kodierungsbits |