Voir aussi Comment un fichier contenant des caractères chinois sait-il combien d'octets utiliser par caractère?- sans aucun doute, il y a d'autres questions SO qui pourraient également aider.
En UTF-8, vous obtenez les types d'octets suivants:
Binary Hex Comments
0xxxxxxx 0x00..0x7F Only byte of a 1-byte character encoding
10xxxxxx 0x80..0xBF Continuation bytes (1-3 continuation bytes)
110xxxxx 0xC0..0xDF First byte of a 2-byte character encoding
1110xxxx 0xE0..0xEF First byte of a 3-byte character encoding
11110xxx 0xF0..0xF4 First byte of a 4-byte character encoding
(La dernière ligne semble devoir lire 0xF0..0xF7; cependant, la plage de 21 bits d'Unicode (U + 0000 - U + 10FFFF) signifie que la valeur maximale valide est 0xF4; les valeurs 0xF5..0xF7 ne peuvent pas apparaître dans UTF-8 valide.)
Regarder si une séquence particulière d'octets est valide UTF-8 signifie que vous devez penser à:
- Octets de continuation apparaissant là où ils n'étaient pas attendus
- Octets de non-continuation apparaissant là où un octet de continuation est attendu
- Caractères incomplets à la fin de la chaîne (variation de 'octet de continuation attendu')
- Séquences non minimales
- Substituts UTF-16
En UTF-8 valide, les octets 0xF5..0xFF ne peuvent pas apparaître.
Séquences non minimales
Il existe plusieurs représentations possibles pour certains personnages. Par exemple, le caractère Unicode U + 0000 (ASCII NUL) pourrait être représenté par:
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80
Cependant, la norme Unicode indique clairement que les trois dernières alternatives ne sont pas acceptables car elles ne sont pas minimales. Il se trouve que les octets 0xC0 et 0xC1 ne peuvent jamais apparaître dans un UTF-8 valide car les seuls caractères qui pourraient être codés par ceux-ci sont au minimum codés en tant que caractères à un octet dans la plage 0x00..0x7F.
Substituts UTF-16
Dans le plan multilingue de base (BMP), les valeurs Unicode U + D800 - U + DFFF sont réservées aux substituts UTF-16 et ne peuvent pas apparaître codées en UTF-8 valide. S'ils étaient valides en UTF-8 (ce qui, je le souligne, ils ne le sont pas), alors les substituts seraient encodés:
- U + D800 - 0xED 0xA0 0x80 (plus petit substitut élevé)
- U + DBFF - 0xED 0xAF 0xBF (plus grand substitut élevé)
- U + DC00 - 0xED 0xB0 0x80 (plus petit substitut bas)
- U + DFFF - 0xED 0xBF 0xBF (plus grand substitut bas)
Mauvaises données
Ainsi, vos données BAD doivent contenir des échantillons violant ces diverses prescriptions.
- Octet de continuation non précédé de l'une des valeurs d'octet initiales
- Octets initiaux à plusieurs caractères non suivis de suffisamment d'octets de continuation
- Caractères multi-octets non minimaux
- Substituts UTF-16
- Octets non valides (0xC0, 0xC1, 0xF5..0xFF).
Notez qu'une marque d'ordre d'octet (BOM) U + FEFF, alias espace sans coupure de largeur zéro (ZWNBSP), ne peut pas apparaître non codée en UTF-8 - les octets 0xFF et 0xFE ne sont pas autorisés en UTF-8 valide. Un ZWNBSP codé peut apparaître dans un fichier UTF-8 sous le nom 0xEF 0xBB 0xBF, mais la nomenclature est complètement superflue en UTF-8.
Il existe également des non- caractères en Unicode. U + FFFE et U + FFFF sont deux de ces non-caractères (et les deux derniers points de code dans chaque plan, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF sont d'autres ). Ceux-ci ne devraient normalement pas apparaître dans les données Unicode pour l'échange de données, mais peuvent apparaître dans un usage privé. Voir le lien FAQ Unicode pour de nombreux détails sordides, y compris l'histoire assez complexe des non-caractères en Unicode. (Le rectificatif n ° 9: Clarification sur les non-personnages, publié en janvier 2013, fait ce que son titre suggère - clarifie la signification des non-caractères.)