Quelles sont les différences entre UTF-8, UTF-16 et UTF-32 ?
Je comprends qu'ils stockent tous de l'Unicode et que chacun utilise un nombre différent d'octets pour représenter un caractère. Y a-t-il un avantage à choisir l'un plutôt que l'autre ?
Quelles sont les différences entre UTF-8, UTF-16 et UTF-32 ?
Je comprends qu'ils stockent tous de l'Unicode et que chacun utilise un nombre différent d'octets pour représenter un caractère. Y a-t-il un avantage à choisir l'un plutôt que l'autre ?
UTF-8 a un avantage dans le cas où les caractères ASCII représentent la majorité des caractères dans un bloc de texte, car UTF-8 les code sur 8 bits (comme ASCII). Il est également avantageux dans la mesure où un fichier UTF-8 contenant uniquement des caractères ASCII a le même encodage qu'un fichier ASCII.
L'UTF-16 est meilleur là où l'ASCII n'est pas prédominant, car il utilise principalement 2 octets par caractère. L'UTF-8 commencera à utiliser 3 octets ou plus pour les caractères d'ordre supérieur, alors que l'UTF-16 n'utilise que 2 octets pour la plupart des caractères.
L'UTF-32 couvre tous les caractères possibles en 4 octets. Il est donc assez volumineux. Je ne vois aucun avantage à l'utiliser.
Avantage de l'UTF-32 : il n'est pas nécessaire de décoder les données stockées dans le point de code Unicode 32 bits pour, par exemple, les manipuler caractère par caractère. Le point de code est déjà disponible dans votre tableau/vecteur/chaîne.
@rq : Vous avez tout à fait raison et Adam fait la même remarque. Cependant, la plupart des manipulations caractère par caractère que j'ai vues fonctionnent avec des ints courts de 16 bits et non avec un vecteur d'entiers de 32 bits. En termes de vitesse brute, certaines opérations seront plus rapides avec 32 bits.
Il est également plus facile à analyser si (que Dieu vous vienne en aide) vous devez réimplémenter la roue.
En bref :
La raison pour laquelle l'UTF-16 fonctionne est que U+D800-U+DFFF sont laissés en blanc dans le BMP pour les paires de substituts. C'est astucieux.
@spurrymoses : Je me réfère strictement à l'espace occupé par les octets de données. L'UTF-8 nécessite 3 octets par caractère asiatique, alors que l'UTF-16 ne nécessite que 2 octets par caractère asiatique. Ce n'est pas vraiment un problème majeur, car les ordinateurs disposent aujourd'hui de tonnes de mémoire par rapport à la quantité moyenne de texte stockée dans la mémoire d'un programme.
UTF-32 n'est plus rarement utilisé... sous osx et linux wchar_t
La valeur par défaut est de 4 octets. gcc dispose d'une option -fshort-wchar
qui réduit la taille à 2 octets, mais rompt la compatibilité binaire avec les librairies std.
@Urkle est techniquement correct parce que le mappage de la gamme complète d'UTF32/LE/BE inclut U-00200000 - U-7FFFFFFF même si Unicode v6.3 se termine à U-0010FFFF inclus. Voici une bonne description de la façon d'encoder/découper 5 et 6 octets en utf8 : lists.gnu.org/archive/html/help-flex/2005-01/msg00030.html
Unicode définit un immense jeu de caractères unique, attribuant une valeur entière unique à chaque symbole graphique (il s'agit d'une simplification majeure, qui n'est pas réellement vraie, mais qui est suffisamment proche pour les besoins de cette question). UTF-8/16/32 sont simplement des façons différentes d'encoder cela.
En bref, l'UTF-32 utilise des valeurs de 32 bits pour chaque caractère. Cela permet d'utiliser un code de largeur fixe pour chaque caractère.
L'UTF-16 utilise 16 bits par défaut, mais cela ne donne que 65 000 caractères possibles, ce qui est loin d'être suffisant pour l'ensemble des caractères Unicode. Certains caractères utilisent donc des paires de valeurs de 16 bits.
L'UTF-8 utilise des valeurs de 8 bits par défaut, ce qui signifie que les 127 premières valeurs sont des caractères d'un octet de largeur fixe (le bit le plus significatif est utilisé pour indiquer qu'il s'agit du début d'une séquence de plusieurs octets, ce qui laisse 7 bits pour la valeur réelle du caractère). Tous les autres caractères sont encodés comme des séquences de 4 octets maximum (si ma mémoire est bonne).
Cela nous amène à parler des avantages. Tous les caractères ASCII sont directement compatibles avec l'UTF-8, de sorte que pour la mise à jour des applications existantes, l'UTF-8 est un choix courant et évident. Dans presque tous les cas, c'est aussi celui qui utilise le moins de mémoire. D'un autre côté, vous ne pouvez pas garantir la largeur d'un caractère. Il peut avoir une largeur de 1, 2, 3 ou 4 caractères, ce qui complique la manipulation des chaînes de caractères.
UTF-32 est à l'opposé, il utilise le plus de mémoire (chaque caractère a une largeur fixe de 4 octets), mais d'un autre côté, vous pouvez conozca que chaque caractère a cette longueur précise, ce qui simplifie grandement la manipulation des chaînes de caractères. Vous pouvez calculer le nombre de caractères d'une chaîne simplement à partir de sa longueur en octets. Ce n'est pas possible avec l'UTF-8.
L'UTF-16 est un compromis. Il permet à le plus tiennent dans une valeur de 16 bits de largeur fixe. Ainsi, tant que vous n'avez pas de symboles chinois, de notes de musique ou autres, vous pouvez supposer que chaque caractère a une largeur de 16 bits. Il utilise moins de mémoire que l'UTF-32. Mais c'est en quelque sorte "le pire des deux mondes". Il utilise presque toujours plus de mémoire que l'UTF-8 et n'évite toujours pas le problème qui affecte l'UTF-8 (caractères de longueur variable).
Enfin, il est souvent utile de se contenter de ce que la plateforme prend en charge. Windows utilise UTF-16 en interne, c'est donc le choix le plus évident.
Linux varie un peu, mais utilise généralement UTF-8 pour tout ce qui est compatible avec Unicode.
La réponse est donc courte : Les trois codages peuvent coder le même jeu de caractères, mais ils représentent chaque caractère sous la forme de séquences d'octets différentes.
Il est inexact de dire qu'Unicode attribue un nombre entier unique à chaque symbole graphique . Il attribue un tel à chaque point de code, mais certains points de code sont des points de code. caractères de contrôle invisibles et certains symboles graphiques requièrent points de code multiples à représenter.
@tchrist : oui, c'est inexact. Le problème est que pour expliquer correctement Unicode, il faut écrire des milliers de pages. J'espérais faire passer le concept de base pour expliquer la différence entre les encodages
@jalf lol c'est vrai donc en gros pour expliquer l'Unicode il faudrait écrire la phrase Spécification de base de l'Unicode
Unicode est une norme et environ UTF-x vous pouvez considérer qu'il s'agit d'une mise en œuvre technique à des fins pratiques :
Les "langues courantes" ne sont pas si courantes que cela dans de nombreuses parties du monde ^^
UTF-16 est en fait optimisé pour les caractères non ASCII. Cela dépend donc des langues dans lesquelles il sera utilisé.
@tuxayo tout à fait d'accord, il est intéressant de noter les ensembles de caractères Hanzi et Kanji pour la partie asiatique du monde.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
52 votes
Regardez cette vidéo si vous êtes intéressé par le fonctionnement de l'Unicode. youtube.com/watch?v=MijmeoH9LT4
1 votes
La vidéo se concentre sur l'UTF-8 et, effectivement, elle explique bien comment fonctionne le codage à longueur variable et est principalement compatible avec les ordinateurs qui lisent ou écrivent uniquement de l'ASCII à longueur fixe. Les responsables d'Unicode ont été intelligents lorsqu'ils ont conçu l'encodage UTF-8.
1 votes
J'ai créé un outil en ligne pour la conversion et la comparaison.
1 votes
UTF-8 est la norme de facto dans la plupart des logiciels modernes pour les fichiers enregistrés . Plus précisément, c'est l'encodage le plus utilisé pour le HTML et les fichiers de configuration et de traduction (Minecraft, par exemple, n'accepte aucun autre encodage pour toutes ses informations textuelles). UTF-32 est rapide pour la représentation de la mémoire interne et UTF-16 est en quelque sorte obsolète , actuellement utilisé uniquement dans Win32 pour des raisons historiques ( UTF-16 était de longueur fixe à l'époque de Windows 95)
1 votes
@VladislavToncharov UTF-16 n'a jamais été un encodage de longueur fixe. Vous le confondez avec UCS-2.
0 votes
@Kotauskas Javascript utilise toujours UTF-16 pour presque tout.