Quartet haut | Quartet bas (toutes les valeurs sont en hexadécimal) | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
...0 | ...1 | ...2 | ...3 | ...4 | ...5 | ...6 | ...7 | ...8 | ...9 | ...A | ...B | ...C | ...D | ...E | ...F | ||
0... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
1... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
2... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
3... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
4... | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 1 | 1 | 1 | 1 | 1 | |
5... | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 1 | 1 | 1 | 1 | 1 | 1 | |
6... | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 1 | 1 | 1 | 1 | 1 | |
7... | 9 | 9 | 9 | 9 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||||
8... | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | |
9... | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | |
A... | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 1 | 2 | 2 | |
B... | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 1 | 3 | 3 | ||
C... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | |
D... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 | 3 | 4 | 4 | 4 | 4 | |
E... | 1 | 4 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 4 | 4 | 5 | 5 | 5 | |
F... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 5 | 6 | 6 | 0 | |||
Légende | 0 | Caractère de contrôle représenté sur 1 octet | |||||||||||||||
1 | Caractère graphique de l’ASCII représenté sur 1 octet | ||||||||||||||||
2 | Premier octet d’un point de code représenté sur 2 octets | ||||||||||||||||
3 | Premier octet d’un point de code représenté sur 3 octets | ||||||||||||||||
4 | Premier octet d’un point de code représenté sur 4 octets | ||||||||||||||||
5 | Premier octet d’un point de code représenté sur 5 octets | ||||||||||||||||
6 | Premier octet d’un point de code représenté sur 6 octets | ||||||||||||||||
9 | Octet de queue d’un caractère codé sur plusieurs octets | ||||||||||||||||
Notes :
La table montre en italique et petits caractères les entrées correspondantes. |
Un défaut de l’UTF-EBCDIC est qu’il n’est pas simple de détecter, dans un texte codé en UTF-EBCDIC, quels octets délimitent chaque séquence.
En effet, ils sont dispersés parmi les 256 valeurs possibles, et la technique courante nécessite une table de correspondance permettant de savoir si un octet isolé représente un caractère (sauf pour les codes de contrôle C0 et C1 groupés entre 0x00 et 0x3F ou le caractère d’oblitération (DEL) codé 0xfF dans toutes les versions de l’EBCDIC), ou si c'est un octet de queue ou un octet de tête indiquant la longueur effective de la séquence.
Cette table de correspondance est décrite dans le Rapport technique n°16 et contient des drapeaux (shadow flags) pour chaque valeur d’octet possible. Son coût algorithmique et en termes de performance est non négligeable, et finalement similaire à celui de la table de permutation utilisée dans la deuxième étape de transformation depuis l’UTF-EBCDIC. Son intérêt reste très limité en termes de performance, puisqu’il faut encore traiter spécialement les octets finals (tous identifiés par le même drapeau car on ne peut connaître leur position relative dans la séquence uniquement depuis leur seule valeur d’octet) et procéder à des boucles supplémentaires de lecture et de test pour trouver le premier octet de la séquence.
Aussi, de nombreuses implémentations de l’UTF-EBCDIC se contentent uniquement de la table de permutation inverse des octets UTF-EBCDIC vers UTF-8-Mod, et se passent de la table de drapeaux. Ils effectuent alors un simple test de valeur, sachant que dans UTF-8-Mod, les octets de queue obéissent tous à la condition très simple à tester (écrite ici en syntaxe des langages C, C++, Java ou C#) :