Qual è la differenza tra UTF-8 e ISO-8859-1 ?
Qual è la differenza tra UTF-8 e ISO-8859-1 ?
Risposte:
UTF-8 è una codifica multibyte che può rappresentare qualsiasi carattere Unicode. ISO 8859-1 è una codifica a byte singolo che può rappresentare i primi 256 caratteri Unicode. Entrambi codificano ASCII esattamente allo stesso modo.
Wikipedia spiega entrambi ragionevolmente bene: UTF-8 vs Latin-1 (ISO-8859-1). Ex è una codifica a lunghezza variabile, quest'ultima codifica a lunghezza fissa a byte singolo. Latin-1 codifica solo i primi 256 punti di codice del set di caratteri Unicode, mentre UTF-8 può essere utilizzato per codificare tutti i punti di codice. A livello di codifica fisica, solo i punti di codice 0 - 127 vengono codificati in modo identico; i punti di codice 128 - 255 differiscono diventando sequenza di 2 byte con UTF-8 mentre sono singoli byte con Latin-1.
UTF è una famiglia di schemi di codifica multi-byte che può rappresentare punti di codice Unicode che possono essere rappresentativi di un massimo di 2 ^ 31 [circa 2 miliardi] di caratteri. UTF-8 è un sistema di codifica flessibile che utilizza tra 1 e 4 byte per rappresentare i primi 2 ^ 21 [circa 2 milioni] punti di codice.
Per farla breve: qualsiasi personaggio con un punto di codice / rappresentazione ordinale inferiore a 127, noto anche come ASCII sicuro a 7 bit, è rappresentato dalla stessa sequenza di 1 byte della maggior parte delle altre codifiche a byte singolo. Qualsiasi carattere con un punto di codice superiore a 127 è rappresentato da una sequenza di due o più byte, con i dettagli della codifica meglio spiegati qui .
ISO-8859 è una famiglia di schemi di codifica a byte singolo utilizzati per rappresentare alfabeti che possono essere rappresentati nell'intervallo da 127 a 255. Questi vari alfabeti sono definiti come "parti" nel formato ISO-8859- n , il più familiare di questi probabilmente sono ISO-8859-1 alias 'Latin-1'. Come con UTF-8, l'ASCII sicuro a 7 bit rimane invariato indipendentemente dalla famiglia di codifica utilizzata.
Lo svantaggio di questo schema di codifica è la sua incapacità di accogliere lingue composte da più di 128 simboli o di visualizzare in sicurezza più di una famiglia di simboli contemporaneamente. Inoltre, con l'ascesa dell'UTF, le codifiche ISO-8859 sono cadute in disgrazia. Il "gruppo di lavoro" ISO responsabile del suo scioglimento nel 2004, lasciando la manutenzione al sottocomitato principale.
ASCII: 7 bit. 128 punti di codice.
ISO-8859-1: 8 bit. 256 punti di codice.
UTF-8: 8-32 bit (1-4 byte). 1.112.064 punti codice.
Sia ISO-8859-1 che UTF-8 sono retrocompatibili con ASCII, ma UTF-8 non è retrocompatibile con ISO-8859-1:
#!/usr/bin/env python3
c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))
Produzione:
©
b'\xc2\xa9'
b'\xa9'
ISO-8859-1 è uno standard legacy degli anni '80. Può rappresentare solo 256 caratteri, quindi adatto solo per alcune lingue nel mondo occidentale. Anche per molte lingue supportate, mancano alcuni caratteri. Se crei un file di testo in questa codifica e provi a copiare / incollare alcuni caratteri cinesi, vedrai strani risultati. Quindi, in altre parole, non usarlo. Unicode ha conquistato il mondo e UTF-8 è praticamente lo standard in questi giorni a meno che tu non abbia alcuni motivi legacy (come le intestazioni HTTP che devono essere compatibili con tutto).
Un'altra cosa importante da realizzare: se vedi iso-8859-1
, probabilmente si riferisce a Windows-1252 piuttosto che a ISO / IEC 8859-1 . Differiscono nell'intervallo 0x80–0x9F, dove ISO 8859-1 ha i codici di controllo C1 e Windows-1252 ha invece caratteri visibili utili.
Ad esempio, ISO 8859-1 ha 0x85 come carattere di controllo (in Unicode, U + 0085, ``), mentre Windows-1252 ha un'ellissi orizzontale (in Unicode, U + 2026 ELLIPSIS ORIZZONTALE, …
).
Le specifiche di codifica WHATWG (utilizzate da HTML) dichiarano espressamente iso-8859-1
di essere un'etichetta per windows-1252
e i browser Web non supportano ISO 8859-1 in alcun modo: le specifiche HTML indicano che tutte le codifiche nelle specifiche di codifica devono essere supportate e non più .
Inoltre, i riferimenti a caratteri numerici HTML utilizzano essenzialmente Windows-1252 per valori a 8 bit anziché punti di codice Unicode; per https://html.spec.whatwg.org/#numeric-character-reference-end-state , …
produrrà U + 2026 anziché U + 0085.
La mia ragione per ricercare questa domanda era dal punto di vista, in che modo sono compatibili. Il set di caratteri Latin1 (iso-8859) è compatibile al 100% per essere archiviato in un archivio dati utf8. Tutti i caratteri ASCII e Extended-ASCII verranno archiviati come byte singolo.
Andando dall'altra parte, dal set di caratteri utf8 a Latin1 può o meno funzionare. Se sono presenti caratteri a 2 byte (caratteri oltre esteso-ascii 255) non verranno archiviati in un archivio dati Latin1.