Différences de format Unicode, UTF, ASCII, ANSI

351

Quelle est la différence entre les Unicode, UTF8, UTF7, UTF16, UTF32, ASCII, et ANSIencodages?

En quoi ces informations sont-elles utiles aux programmeurs?

web dunia
la source

Réponses:

470

En descendant votre liste:

  • " Unicode " n'est pas un codage, bien que malheureusement, beaucoup de documentation l'utilise de manière imprécise pour faire référence au codage Unicode que ce système particulier utilise par défaut. Sous Windows et Java, cela signifie souvent UTF-16; dans de nombreux autres endroits, cela signifie UTF-8. Correctement, Unicode fait référence au jeu de caractères abstrait lui-même, pas à un codage particulier.
  • UTF-16 : 2 octets par "unité de code". Il s'agit du format natif des chaînes dans .NET, et généralement dans Windows et Java. Les valeurs en dehors du plan multilingue de base (BMP) sont codées sous forme de paires de substitution. Celles-ci étaient relativement rarement utilisées, mais maintenant de nombreuses applications grand public devront être conscientes des caractères non BMP afin de prendre en charge les emojis.
  • UTF-8 : encodage de longueur variable, 1-4 octets par point de code. Les valeurs ASCII sont codées en ASCII sur 1 octet.
  • UTF-7 : généralement utilisé pour l'encodage du courrier. Il y a de fortes chances que si vous pensez en avoir besoin et que vous ne faites pas de courrier, vous vous trompez. (C'est juste mon expérience de personnes qui postent dans des groupes de discussion, etc. - en dehors du courrier, ce n'est vraiment pas du tout utilisé.)
  • UTF-32 : codage à largeur fixe utilisant 4 octets par point de code. Ce n'est pas très efficace, mais facilite la vie en dehors du BMP. J'ai une Utf32Stringclasse .NET dans le cadre de ma bibliothèque MiscUtil , si jamais vous le souhaitez. (Cela n'a pas été testé de manière très approfondie, attention.)
  • ASCII : codage sur un seul octet utilisant uniquement les 7 derniers bits. (Code Unicode points 0-127.) Pas d'accents, etc.
  • ANSI: Il n'y a pas d'encodage ANSI fixe - il y en a beaucoup. Habituellement, lorsque les gens disent "ANSI", ils signifient "les paramètres régionaux / page de codes par défaut pour mon système" qui sont obtenus via Encoding.Default , et sont souvent Windows-1252 mais peuvent être d'autres paramètres régionaux.

Il y a plus sur ma page Unicode et des conseils pour déboguer les problèmes Unicode .

L'autre grande ressource de code est unicode.org qui contient plus d'informations que vous ne pourrez jamais vous y retrouver - le plus utile est peut-être les diagrammes de code .

Jon Skeet
la source
6
Le terme «ANSI» lorsqu'il est appliqué aux pages de codes 8 bits de Microsoft est un terme impropre. Ils étaient basés sur des projets soumis à la normalisation ANSI, mais ANSI lui-même ne les a jamais normalisés. Windows-1252 (la page de codes la plus communément appelée "ANSI") est similaire à ISO 8859-1 (Latin-1), sauf que Windows-1252 a des caractères imprimables dans la plage 0x80..0x9F, où ISO 8859-1 a des caractères de contrôle dans cette plage. Unicode a également des caractères de contrôle dans cette plage. en.wikipedia.org/wiki/Windows_code_page
Keith Thompson
1
@ jp2code: Je ne le ferais pas - mais vous devez faire la distinction entre "le contenu renvoyé via HTTP depuis le serveur Web" et le "contenu envoyé par courrier électronique". Ce n'est pas le contenu de la page Web qui envoie l'e-mail - c'est l'application derrière, probablement. Le contenu Web serait le meilleur en UTF-8; le contenu du courrier pourrait être en UTF-7, bien que je soupçonne que c'est bien de le garder en UTF-8 de nos jours.
Jon Skeet
2
Pour UTF-16, à mon humble avis, je dirais "2 octets par unité de code" car un point de code en dehors du BMP sera codé en paires de substitution comme 2 unités de code (4 octets).
Ludovic Kuty
1
Manque les différences entre UTF-16LE (dans .NET) et BE ainsi que la notion de nomenclature.
Maarten Bodewes
2
@Andrew: Non, il n'y a pas de marqueur d'encodage (général). Windows 1252 ne peut pas représenter la nomenclature Unicode, et cela n'aurait aucun sens car ce n'est de toute façon qu'un encodage d'un octet par caractère.
Jon Skeet
68

Quelques lectures pour vous familiariser avec les encodages de caractères: Joel sur le logiciel: le minimum absolu Chaque développeur de logiciels doit absolument, positivement, connaître Unicode et les jeux de caractères (pas d'excuses!)

Soit dit en passant - ASP.NET n'a rien à voir avec cela. Les encodages sont universels.

Tomalak
la source
7
Répondu ici 6 ans après la rédaction de l'article. Je l'ai lu 8 ans après la rédaction du message. 14 ans plus tard et c'est toujours une bonne lecture. Il y a plus de la moitié de ma vie. Incroyable.
Dave Knise