Le CESU-8 (Compatibility Encoding Scheme for UTF-16: 8-Bit) est un codage de caractères variante d'UTF-8 décrit dans le document Unicode Technical Report #26[1] publié par le consortium Unicode. C'est un encodage d'Unicode sur 8 bits non normalisé, destiné à un usage interne et non destiné à, ni recommandé pour, des communications. Certains considèrent que sa place est davantage parmi les Technical Notes de l'organisation que dans les rapports techniques.
Le but principal de CESU-8 est de maintenir la même collation binaire qu'UTF-16 tout en gardant un codage 8 bits. Cependant, comme aucun traitement du caractère NUL n'est appliqué, la chaîne résultante ne peut être traitée comme une chaine terminée par un caractère NUL si la chaine d'origine contient le caractère U+0000.
CESU-8 s'apparente à l'UTF-8 modifié de Java (Modified UTF-8) mais privé du codage spécial du caractère NUL (U+0000). Il diffère seulement d'UTF-8 par sa représentation différente des caractères supplémentaires. Pour les caractères extérieurs au Plan multilingue de base (ceux générant une paire de seizets d'indirection en UTF-16), CESU-8 génère uniquement des séquences de 6 octets (c'est-à-dire deux fois 3 octets), là où UTF-8 génère une séquence de taille de 4 octets pour la valeur du caractère dans UTF-32. Pour ces caractères, CESU-8 prend les valeurs, situées dans U+D800..U+DFFF, de chacun des deux points de code de la paire de seizets, puis les code sur 6 octets, au lieu de coder le caractère représenté par la paire.
En dehors de ces caractères, assez peu courants, les flux UTF-8 et CESU-8 sont similaires et peuvent conduire à des détections erronées. C'est une des raisons pour lesquelles le consortium Unicode ne recommande pas son usage hors d'une mise en œuvre fermée. Le nom originel de CESU-8 était d'ailleurs UTF-8S, ce qui renforçait la confusion.
Dans le cas de données UTF-16 d'entrée invalides (c'est-à-dire un seizet de paire non couplé), bien que reproduire l'erreur dans la sortie serait fidèle, il est recommandé que le convertisseur notifie l'erreur et arrête le traitement[2].
Dans la pratique, le seul environnement majeur faisant usage de CESU-8 est le SGBD relationnel Oracle, qui semble-t-il utilise désormais UTF-16 comme représentation interne des caractères.[réf. nécessaire] « L'UTF8 » (sans le trait d'union) d'Oracle, en réalité CESU-8, est un codec non-standard rejetant les séquences représentant un caractère hors BMP mais acceptant et générant celles usitées dans CESU-8. On peut obtenir la norme UTF-8 en utilisant le jeu de caractères « AL32UTF8 » (depuis Oracle version 9.0).
Il a aussi été rapporté que MySQL depuis la version 5 tolère les séquences CESU-8 quand UTF-8 est attendu[3].
Codage | U+0045 | U+0205 | U+10400 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
UTF-8 | 45 | C8 | 85 | F0 | 90 | 90 | 80 | ||||||||
UTF-16 | 0045 | 0205 | D801 | DC00 | |||||||||||
CESU-8 | 45 | C8 | 85 | ED | A0 | 81 | ED | B0 | 80 |