La norme C (C99) prévoit à l'échelle des personnages et des caractères multi-octets, mais depuis il n'y a aucune garantie sur le contenu de ces caractères peut contenir, leur valeur est quelque peu limitée. Pour une application donnée, ils fournissent un support utile, mais si votre code doit être en mesure de se déplacer entre les implémentations, il n'y a pas de garanties suffisantes pour qu'ils vous seront utiles.
Par conséquent, l'approche proposée par Hans van Eck (qui consiste à écrire un wrapper autour de l'unité de soins intensifs - International Components for Unicode - bibliothèque) est son, de l'OMI.
Le codage UTF-8 a de nombreux mérites, dont l'une est que si on ne plaisante pas avec les données (en tronquant, par exemple), alors il peut être copiée par des fonctions qui ne sont pas pleinement conscients de la complexité de l'encodage UTF-8. Ce n'est absolument pas le cas avec d' wchar_t
.
Unicode est de 21 bits format. C'est, Unicode réserves de points de code à partir de U+0000 à U+10FFFF.
L'une des choses utiles à propos de l'UTF-8, UTF-16 et UTF-32 formats (où UTF signifie Unicode Transformation Format - voir Unicode), c'est que vous pouvez convertir entre les trois représentations sans perte d'information. Chacun peut représenter tout ce que les autres peuvent représenter. Les deux UTF-8 et UTF-16 sont multi-octets formats.
UTF-8 est bien connu pour être un multi-octets format, avec une attention à la structure qui le rend possible pour trouver le début de caractères dans une chaîne de manière fiable, à partir de tout point de la chaîne. Caractères codés sur un octet ont la haute-ensemble de bits à zéro. De caractères Multi-octets ont le premier caractère de commencer avec l'un des modèles de bits 110, 1110 ou 11110 (pour 2-octet 3 octet 4 octet), avec des octets en commençant toujours 10. La poursuite personnages sont toujours dans la gamme 0x80 .. 0xBF. Il y a des règles que les caractères UTF-8 doit être représenté dans le minimum de format possible. Une conséquence de ces règles est que les octets 0xC0 et 0xC1 (également 0xF8..0xFF) ne peut pas apparaître en UTF-8 valide les données.
U+0000 .. U+007F 1 byte 0xxx xxxx
U+0080 .. U+07FF 2 bytes 110x xxxx 10xx xxxx
U+0800 .. U+FFFF 3 bytes 1110 xxxx 10xx xxxx 10xx xxxx
U+10000 .. U+10FFFF 4 bytes 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
À l'origine, il était à espérer que Unicode serait un code de 16 bits ensemble et tout allait s'insérer dans un code de 16 bits de l'espace. Malheureusement, le monde réel est plus complexe, et il devait être étendue à l'actuel de 21 bits de codage.
UTF-16 est donc d'une seule unité (mot de 16 bits) code pour le "Plan Multilingue de Base", ce qui signifie les personnages avec des points de code Unicode U+0000 .. U+FFFF, mais utilise deux unités (32 bits) pour les caractères en dehors de cette plage. Ainsi, le code qui fonctionne avec le codage UTF-16 doit être capable de gérer de largeur variable de codage, tout comme de l'UTF-8. Les codes pour le double-unité caractères sont appelés les mères porteuses.
Les mères porteuses sont des points de code à partir de deux plages de valeurs Unicode, réservés pour une utilisation en tant que leader et suiveur les valeurs de paires d'unités de code en UTF-16. Leader, appelé aussi de haut, les mères porteuses à partir de U+D800 U+DBFF, et de fuite, ou faible, les mères porteuses à partir de U+DC00 à U+DFFF. Ils sont appelés substituts, car ils ne représentent pas les caractères directement, mais seulement comme une paire.
UTF-32 est évidemment possible d'encoder n'importe quel point de code Unicode en une seule unité de stockage. Il est efficace pour les calculs, mais pas pour le stockage.
Vous pouvez trouver beaucoup plus d'informations à l' ICU et Unicode sites web.