Post by Do Re Mi chel La Si DoJe me mélange les pinceaux, entre les surrogates et les caractères
"élargis" (wide, utilisant des entiers de plus de deux octets).
Quelqu'un pourrait-il, en 3 ou 4 lignes, m'éclaircir cette situation,
m'éviter des confusions et/ou un éparpillement.
Je vais un peu plus long, désolé.
Au départ, aux États-Unis et en Europe l'unité de transmission est en
général le « byte » de 8 bits. Insuffisant pour les langues d'Asie de l'Est,
d'où invention des (jeux de) caractères double byte, où chaque idéogramme
est codé sur deux bytes.
D'un côté, le langage C. Au départ et en général, char=8 bits=1 byte. Les
idéogrammes sont manipulés sur 2 chars. Mais ce n'est pas pratique, en
particulier à cause des problèmes d'ordre. D'où invention des caractères
élargis, contenant dans un seul objet (normalement un unsigned int ou
unsigned short) les deux bytes; de cette manière on peut appliquer les mêmes
algorithmes, juste en modifiant le type de base. Ce type de base se nomme
wchar_t, pour « wide character ».
Cette invention a été adoptée vers 1988 dans la norme C, et étendue par
vague successive en 1992 (WPI) et en 1994 (MSE.) Elle est surtout répandue
dans le monde Unix en Asie de l'Est. Les encodages ne sont pas figés, et la
taille du type wchar_t non plus.
De l'autre, Unicode, conçu comme une solution au problème des encodages.
Donc volonté d'un encodage unique. Pour des raisons d'efficacité, le choix
s'est fixée sur une unité d'encodage de 16 bits (largeur fixée).
Vers 1991, en implantant Windows NT (écrit en C), MS a choisi Unicode comme
jeu de base, et les ingénieurs ont eu l'idée d'utiliser le type wchar_t pour
y stocker les caractères Unicode. De ce fait, dans le monde NT/MS, wchar_t
est forcé à 16 bits, jusqu'à la fin des temps (ou à peu près); l'encodage
est commun.
Vers 1996, l'on s'est aperçu que les 65000 positions ne suffiraient pas,
d'où nécessité d'une bidouille. Ce sera le schéma UTF-16, c'est-à-dire le
retour de l'idée des caractères doubles, mais cette fois-ci on double 16
bits, au total 32. Les caractères ainsi créés sont codés comme une paire de
« surrogates ».
Antoine