Quelle est la différence entre UTF-8 et ISO-8859-1 ?
Quelle est la différence entre UTF-8 et ISO-8859-1 ?
Réponses:
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.
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.
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 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.
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'
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).
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.
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.