Qual è la differenza tra UTF-8 e ISO-8859-1?


Risposte:


321

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.


11
Una cosa da notare che ASCII si estende solo da 0 a 127. L'MSB è sempre 0.
Hritik,

3
Quando vengono definiti punti di codice superiori a 127, il sistema di codifica è una versione di Extended ASCII.
Rohan Bhale,

1
@RohanBhale Non usare la frase ASCII estesa; causerà solo confusione.
Lister

Ma ascii esteso potrebbe essere il termine corretto. L'ho letto su più risorse
Rohan Bhale il

135

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.


@mu forse la mia affermazione era ambigua, ma non è errata - non stavo parlando di sequenze di byte codificate, ma piuttosto di set di caratteri codificati; ciò significa che ISO-8859-1 viene utilizzato per codificare i primi 256 punti di codice del set di caratteri Unicode.
StaxMan,

Il tuo chiarimento funziona per me e "ambiguo" sarebbe stata una scelta di parole migliore di "errato".
mu è troppo corto il

83

UTF

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

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.


1
+1 per rispondere alla domanda ma andare oltre e offrire informazioni sulle codifiche correlate. Ri: punti di codice per UTF-8, secondo stackoverflow.com/a/38488358/3353984 , UTF-8 supporta 2 ^ 21 punti di codice. È un errore o potrebbe essere necessaria una correzione qui?
Tom Loredo il

1
Unicode è in realtà 17 piani di 2 ^ 16 punti di codice. Da 0x00_0000 a 0x1F_FFFF. I 17 piani possono ospitare 1.114.112 punti codice. Di questi, 2.048 sono surrogati, 66 non sono caratteri e 137.468 sono riservati per uso privato, lasciando 974.530 per incarico pubblico. Circa 1 milione. Vedi Quanti caratteri può codificare UTF-8? .
georgeawg,

22
  • 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'

21

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).


1
Avevo visto dove Umlaut's non è presumibilmente convertito con UTF8. Abbiamo visto esempi di questo e nella ricerca abbiamo trovato la ISO-8859-1 e sembra funzionare. Abbiamo un sacco di scienziati tedeschi con cui lavoriamo.
Aggie Jon dell'87,

4
Gli Umlaut sono rappresentati come due personaggi in utf8. Si convertono bene e funzionano bene. Il problema deriva da programmi che prevedono 1 byte per carattere. Per questi programmi legacy, ISO-8859-1 ha umlaut di 1 byte.
Erik Aronesty,

3

Da un'altra prospettiva, i file che sia la codifica Unicode che ASCII non riescono a leggere perché contengono un byte 0xc0, sembrano essere letti correttamente da iso-8859-1. L'avvertenza è che il file non dovrebbe contenere caratteri unicode ovviamente.


2

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-1di essere un'etichetta per windows-1252e 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.


Oops! Pensavo di averlo scritto, ma l'ho perso in una riscrittura. L'ho inserito ora.
Chris Morgan,

0

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.


2
Utile, ma penso che tu abbia inteso 127 anziché 255 in extended-ascii 255?
Hydroper

18
Latin-1 o iso-8859-1 non è compatibile al 100% per essere archiviato in utf8. Qualsiasi carattere Latin-n o iso-8859-n sopra 127 non verrà tradotto in un singolo byte utf-8 carattere. Tuttavia, per i valori 1-127, si tradurranno esattamente.
Marlin Pierce,

4
Questa risposta è un po 'confusa nel suo uso del termine "esteso ascii", che è solo un termine che si riferisce a qualsiasi codifica di caratteri che non sia ASCII. UTF-8 e latin-1 sono esempi di codifiche ASCII estese. Ma i caratteri latini-1 non ascii (cioè punti di codice sopra 127) non possono essere codificati come un singolo byte in UTF-8.
rdb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.