Différence entre UTF-8 et UTF-16? Pourquoi en avons-nous besoin?
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";
md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
Réponses:
Je crois qu'il y a beaucoup de bons articles à ce sujet sur le Web, mais voici un bref résumé.
UTF-8 et UTF-16 sont des codages de longueur variable. Cependant, en UTF-8, un caractère peut occuper un minimum de 8 bits, tandis qu'en UTF-16, la longueur des caractères commence par 16 bits.
Principaux avantages de l'UTF-8:
Principaux inconvénients de l'UTF-8:
Principaux avantages de l'UTF-16:
char
comme composant primitif de la chaîne.Principaux inconvénients de l'UTF-16:
En général, UTF-16 est généralement meilleur pour la représentation en mémoire car BE / LE n'y est pas pertinent (utilisez simplement l'ordre natif) et l'indexation est plus rapide (n'oubliez pas de gérer correctement les paires de substitution). UTF-8, d'autre part, est extrêmement bon pour les fichiers texte et les protocoles réseau car il n'y a pas de problème BE / LE et la terminaison nulle est souvent pratique, ainsi que la compatibilité ASCII.
la source
Ce sont simplement des schémas différents pour représenter les caractères Unicode.
Les deux sont de longueur variable - UTF-16 utilise 2 octets pour tous les caractères du plan multilingue de base (BMP) qui contient la plupart des caractères d'usage courant.
UTF-8 utilise entre 1 et 3 octets pour les caractères dans le BMP, jusqu'à 4 pour les caractères de la plage Unicode actuelle de U + 0000 à U + 1FFFFF, et est extensible jusqu'à U + 7FFFFFFF si cela devient nécessaire ... mais notamment tous les caractères ASCII sont représentés chacun dans un seul octet.
Pour les besoins d'un résumé de message, peu importe lequel de ceux que vous choisissez, tant que tous ceux qui essaient de recréer le résumé utilisent la même option.
Consultez cette page pour en savoir plus sur UTF-8 et Unicode.
(Notez que tous les caractères Java sont des points de code UTF-16 dans le BMP; pour représenter les caractères au-dessus de U + FFFF, vous devez utiliser des paires de substitution en Java.)
la source
Sécurité: utilisez uniquement UTF-8
Il y a eu au moins quelques vulnérabilités de sécurité dans les implémentations de UTF-16 . Voir Wikipedia pour plus de détails .
WHATWG et W3C ont maintenant déclaré que seul UTF-8 doit être utilisé sur le Web.
D'autres groupes disent la même chose.
Ainsi, bien que l'UTF-16 puisse continuer à être utilisé en interne par certains systèmes tels que Java et Windows, le peu d'utilisation de l'UTF-16 que vous avez pu voir dans le passé pour les fichiers de données, l'échange de données, etc., disparaîtra probablement complètement.
la source
Ceci n'est pas lié à UTF-8/16 (en général, bien qu'il soit converti en UTF16 et que la partie BE / LE puisse être définie avec une seule ligne), voici le moyen le plus rapide de convertir une chaîne en octet []. Par exemple: bon exactement pour le cas fourni (code de hachage). String.getBytes (enc) est relativement lent.
la source
Un moyen simple de différencier UTF-8 et UTF-16 est d'identifier les points communs entre eux.
Outre le partage du même numéro Unicode pour un caractère donné, chacun est son propre format.
la source