Quelle est la différence entre UTF-8 et ISO-8859-1?

Réponses:

321

UTF-8 est un codage multi-octets qui peut représenter n'importe quel caractère Unicode. ISO 8859-1 est un codage à un octet qui peut représenter les 256 premiers caractères Unicode. Les deux codent ASCII exactement de la même manière.

Ignacio Vazquez-Abrams
la source
11
Une chose à noter que ASCII s'étend de 0 à 127 uniquement. Le MSB est toujours 0.
Hritik
3
Lorsque des points de code supérieurs à 127 sont définis, le système de codage est une version de l'ASCII étendu.
Rohan Bhale
1
@RohanBhale N'utilisez pas l'expression ASCII étendue; cela ne fera que créer de la confusion.
M. Lister
Mais ascii étendu pourrait être le terme correct. Je l'ai lu sur plusieurs ressources
Rohan Bhale
135

Wikipedia explique les deux raisonnablement bien: UTF-8 vs Latin-1 (ISO-8859-1). Le premier est un codage de longueur variable, le second un codage de longueur fixe d'un octet. Latin-1 code uniquement les 256 premiers points de code du jeu de caractères Unicode, tandis que UTF-8 peut être utilisé pour coder tous les points de code. Au niveau du codage physique, seuls les points de code 0 à 127 sont codés de manière identique; les points de code 128 - 255 diffèrent en devenant une séquence de 2 octets avec UTF-8 alors qu'ils sont des octets simples avec Latin-1.

StaxMan
la source
@mu ma déclaration était peut-être ambiguë, mais elle n'est pas incorrecte - je ne parlais pas de séquences d'octets codées, mais plutôt de jeux de caractères codés; ce qui signifie que l'ISO-8859-1 est utilisé pour coder les 256 premiers points de code du jeu de caractères Unicode.
StaxMan
Votre clarification fonctionne pour moi et "ambigu" aurait été un meilleur choix de mot que "incorrect".
mu est trop court
83

UTF

UTF est une famille de schémas de codage multi-octets qui peuvent représenter des points de code Unicode qui peuvent être représentatifs de 2 ^ 31 [environ 2 milliards] caractères. UTF-8 est un système de codage flexible qui utilise entre 1 et 4 octets pour représenter les 2 ^ 21 [environ 2 millions] points de code.

Pour faire court: tout caractère dont le point de code / la représentation ordinale est inférieur à 127, alias ASCII 7 bits, est représenté par la même séquence de 1 octet que la plupart des autres codages à un octet. Tout caractère dont le point de code est supérieur à 127 est représenté par une séquence de deux octets ou plus, les détails du codage étant mieux expliqués ici .

ISO-8859

ISO-8859 est une famille de schémas de codage à un octet utilisés pour représenter les alphabets qui peuvent être représentés dans la plage de 127 à 255. Ces différents alphabets sont définis comme des "parties" au format ISO-8859- n , le plus familier des ceux-ci étant probablement ISO-8859-1 alias «Latin-1». Comme avec UTF-8, l'ASCII 7 bits sécurisé reste inchangé quelle que soit la famille d'encodage utilisée.

L'inconvénient de ce schéma de codage est son incapacité à prendre en charge des langues comprenant plus de 128 symboles ou à afficher en toute sécurité plusieurs familles de symboles à la fois. De plus, les encodages ISO-8859 sont tombés en disgrâce avec la montée en puissance de l'UTF. Le "groupe de travail" ISO chargé de sa dissolution en 2004, laissant la maintenance à son sous-comité parent.

Sammitch
la source
1
+1 pour répondre à la question mais aller au-delà et offrir des informations sur les encodages associés. Re: points de code pour UTF-8, selon stackoverflow.com/a/38488358/3353984 , UTF-8 prend en charge 2 ^ 21 points de code. Est-ce une erreur ou un correctif peut-il être nécessaire ici?
Tom Loredo
1
Unicode est en fait 17 plans de 2 ^ 16 points de code. 0x00_0000 à 0x1F_FFFF. Les 17 avions peuvent accueillir 1 114 112 points de code. Parmi ceux-ci, 2 048 sont des substituts, 66 sont des non-caractères et 137 468 sont réservés à un usage privé, laissant 974 530 pour affectation publique, soit environ 1 million. Voir Combien de caractères UTF-8 peut-il encoder? .
georgeawg
22
  • ASCII: 7 bits. 128 points de code.

  • ISO-8859-1: 8 bits. 256 points de code.

  • UTF-8: 8-32 bits (1-4 octets). 1 112 064 points de code.

ISO-8859-1 et UTF-8 sont rétrocompatibles avec ASCII, mais UTF-8 n'est pas rétrocompatible avec ISO-8859-1:

#!/usr/bin/env python3

c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))

Production:

©
b'\xc2\xa9'
b'\xa9'
Cyker
la source
21

ISO-8859-1 est une ancienne norme datant des années 80. Il ne peut représenter que 256 caractères, il ne convient donc qu'à certaines langues du monde occidental. Même pour de nombreuses langues prises en charge, certains caractères sont manquants. Si vous créez un fichier texte dans cet encodage et essayez de copier / coller des caractères chinois, vous verrez des résultats étranges. En d'autres termes, ne l'utilisez pas. Unicode a conquis le monde et UTF-8 est à peu près la norme de nos jours, sauf si vous avez des raisons héritées (comme les en-têtes HTTP qui doivent être compatibles avec tout).

Shital Shah
la source
1
J'avais vu où les trémas ne sont pas censés être convertis avec UTF8. Nous en avons vu des exemples et en cherchant, nous avons trouvé l'ISO-8859-1 et cela semble fonctionner. Nous avons beaucoup de scientifiques allemands avec qui nous travaillons.
Aggie Jon du 87
4
Les trémas sont représentés par deux caractères dans utf8. Ils se convertissent bien et fonctionnent bien. Le problème vient des programmes qui attendent 1 octet par caractère. Pour ces programmes hérités, ISO-8859-1 a un tréma de 1 octet.
Erik Aronesty
3

D'un autre point de vue, les fichiers que les encodages unicode et ascii ne parviennent pas à lire car ils contiennent un octet 0xc0semblent être lus correctement par l'iso-8859-1. La mise en garde est que le fichier ne doit pas contenir de caractères unicode bien sûr.

Nikhil VJ
la source
2

Encore une chose importante à réaliser: si vous voyez iso-8859-1, cela se réfère probablement à Windows-1252 plutôt qu'à ISO / IEC 8859-1 . Ils diffèrent dans la plage 0x80–0x9F, où ISO 8859-1 a les codes de contrôle C1 et Windows-1252 a des caractères visibles utiles à la place.

Par exemple, ISO 8859-1 a 0x85 comme caractère de contrôle (en Unicode, U + 0085, ``), tandis que Windows-1252 a des points de suspension horizontaux (en Unicode, U + 2026 ELLIPSIS HORIZONTAL, ).

La spécification WHATWG Encoding (telle qu'utilisée par HTML) déclare expressément iso-8859-1être une étiquette pour windows-1252, et les navigateurs Web ne prennent en aucun cas en charge ISO 8859-1: la spécification HTML dit que tous les encodages de la spécification Encoding doivent être pris en charge, et pas plus .

Également intéressant, les références de caractères numériques HTML utilisent essentiellement Windows-1252 pour les valeurs 8 bits plutôt que les points de code Unicode; par https://html.spec.whatwg.org/#numeric-character-reference-end-state , …produira U + 2026 plutôt que U + 0085.

Chris Morgan
la source
Oops! Je pensais l'avoir écrit, mais je l'ai perdu lors d'une réécriture. Je l'ai mis maintenant.
Chris Morgan
0

Ma raison de rechercher cette question était du point de vue, est de savoir en quoi sont-ils compatibles. Le jeu de caractères Latin1 (iso-8859) est 100% compatible pour être stocké dans une banque de données utf8. Tous les caractères ascii et étendu-ascii seront stockés sous la forme d'un octet unique.

Dans l'autre sens, de utf8 à latin1 charset peut ou peut ne pas fonctionner. S'il existe des caractères de 2 octets (caractères au-delà de Extended-Ascii 255), ils ne seront pas stockés dans une banque de données Latin1.

Alan Jurgensen
la source
2
Utile, mais je pense que vous vouliez dire 127 au lieu de 255 en 255 étendu-ascii?
Hydroper
18
Latin-1 ou iso-8859-1 n'est pas compatible à 100% pour être stocké dans utf8. Tout caractère latin-n ou iso-8859-n supérieur à 127 ne sera pas traduit en un caractère utf-8 à un seul octet. Cependant, pour les valeurs 1-127, elles se traduiront exactement.
Marlin Pierce
4
Cette réponse est un peu déroutante dans son utilisation du terme "ascii étendu", qui est juste un terme pour désigner tout codage de caractères qui n'est pas ASCII. UTF-8 et latin-1 sont des exemples de codages ASCII étendus. Mais, les caractères latin-1 non ascii (c'est-à-dire les points de code supérieurs à 127) ne peuvent pas être codés comme un seul octet en UTF-8.
rdb