Codes supérieurs à 127 sont codés sur plusieurs octets.
En revanche, si notre octet est négatif, cela signifie que c’est probablement un caractère codé en UTF-8, dont le code est supérieur à 127.
Cela signifie aussi qu’il devrait être suivi par au moins un octet de plus négatif.
UTF-8 est conçu pour encoder n’importe quel caractère Unicode en utilisant moins d’espace que possible.
S’il est possible de coder un caractère Unicode dans seulement 2 octets, nous n’utiliserons plus de ces 2 octets. Nous utiliserons 4 octets seulement si absolument nécessaire.
Nous avons alors besoin d’une méthode de deviner combien d’octets est codé un personnage.
Nous pouvons extraire ces informations depuis le premier octet négatif, en comptant le nombre des derniers bits de nos octets sont définis à l’un :
110xxxxx: 2 derniers bits défini sur 1, signifie notre caractère est codé sur 2 octets.
Il faut lire 1 octet négatif plus.
1110xxxx: 3 derniers bits défini sur 1, signifie notre caractère est codé sur 3 octets.
Il faut lire 2 octets négatif plus.
11110xxx : dernier 4 bits défini sur 1, signifie notre caractère est codé sur 4 octets.
Il faut lire 3 octets négatif plus.
L’octet négatif supplémentaire suivant tous les avoir le 8ème bit défini à 1 (signe négatif) et le 7ème bit défini à 0: 10yyyyyy
Si le nombre d’octets supplémentaires suivants est positifs ou ont leur 7ème bit défini à 1, cela signifie que l’UTF-8 encoded caractère est incorrect. Notre application absolument avoir de détecter le codage incorrect.
Codes de 128 à 2047 sont codés sur 2 octets.
(à partir de 0 x 0100 à 0x7FFF)
Caractères codés sur deux octets sont comme ça :
110xxxxx, 10yyyyyy
Pour le décoder, il suffit de regrouper nos parcelles de 5 x avec nos 6 bits y: xxxxxyyyyyy