Qual è la differenza tra ASCII e Unicode?


407

Qual è la differenza esatta tra Unicode e ASCII?

ASCII ha un totale di 128 caratteri (256 nel set esteso).

Esistono specifiche di dimensioni per i caratteri Unicode?




Risposte:


534

ASCII definisce 128 caratteri, che corrispondono ai numeri da 0 a 127. Unicode definisce (meno di) 2 21 caratteri, che, allo stesso modo, si associano ai numeri 0–2 21 (anche se non tutti i numeri sono attualmente assegnati e alcuni sono riservati).

Unicode è un superset di ASCII e i numeri da 0 a 127 hanno lo stesso significato in ASCII come in Unicode. Ad esempio, il numero 65 significa "capitale latina 'A'".

Poiché i caratteri Unicode generalmente non rientrano in un byte a 8 bit, esistono numerosi modi per memorizzare i caratteri Unicode in sequenze di byte, come UTF-32 e UTF-8.


4
@riderBill: e adesso? Di quali 3 bit stai parlando? Non ci sono bit in Unicode. Solo punti di codice.
Kerrek SB,

@riderBill: ancora: di quali "3 byte" stai parlando ora? :-) (Niente di tutto ciò ha a che fare con Unicode. Unicode riguarda solo l'assegnazione di significato ai numeri, non riguarda bit e byte.)
Kerrek SB

8
@riderBill: Unicode non "usa tra 1 e 4 byte". Unicode è un'assegnazione di significato ai numeri. Non utilizza alcun byte. Esistono alcuni schemi di codifica standardizzati per rappresentare i punti di codice Unicode come un flusso di byte, ma sono ortogonali a Unicode come set di caratteri. (Sì, sentiti libero di cancellare come preferisci.)
Kerrek SB

@CleanCrispCode Unicode è in realtà un superset di ISO-8859-1 , che è esso stesso un superset di ASCII. A volte è utile saperlo.
Mark Ransom,

8
Per chiarire, il set di caratteri Unicode stesso è un superset del set di caratteri ISO-8859-1 , ma la codifica UTF-8 non è un superset della codifica ISO-8859-1 ma la codifica ASCII .
minmaxavg,

393

Capire perché ASCII e Unicode sono stati creati in primo luogo mi ha aiutato a capire le differenze tra i due.

ASCII, Origini

Come indicato nelle altre risposte, ASCII utilizza 7 bit per rappresentare un carattere. Usando 7 bit, possiamo avere un massimo di 2 ^ 7 (= 128) combinazioni distinte * . Ciò significa che possiamo rappresentare al massimo 128 caratteri.

Aspetta, 7 bit? Ma perché non 1 byte (8 bit)?

L'ultimo bit (8 °) viene utilizzato per evitare errori come bit di parità . Questo è stato rilevante anni fa.

La maggior parte dei caratteri ASCII sono caratteri stampabili dell'alfabeto come abc, ABC, 123,? & !, ecc. Gli altri sono caratteri di controllo come ritorno a capo, avanzamento riga , tab, ecc.

Vedi sotto la rappresentazione binaria di alcuni caratteri in ASCII:

0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)

Vedi la tabella ASCII completa qui .

ASCII era pensato solo per l'inglese.

Che cosa? Perché solo inglese? Così tante lingue là fuori!

Perché il centro dell'industria informatica era negli Stati Uniti a quel tempo. Di conseguenza, non avevano bisogno di sostenere accenti o altri segni come á, ü, ç, ñ, ecc. (Aka diacritici ).

ASCII esteso

Alcune persone intelligenti hanno iniziato a usare l'ottavo bit (il bit usato per parità) per codificare più caratteri per supportare la loro lingua (per supportare "é", ad esempio in francese). Basta usare un bit in più per raddoppiare le dimensioni della tabella ASCII originale per mappare fino a 256 caratteri (2 ^ 8 = 256 caratteri). E non 2 ^ 7 come prima (128).

10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)

Il nome per questo "ASCII esteso a 8 bit e non a 7 bit come prima" potrebbe essere chiamato semplicemente "ASCII esteso" o "ASCII a 8 bit".

Come ha sottolineato @Tom nel suo commento qui sotto, non esiste " ASCII esteso ", ma questo è un modo semplice per fare riferimento a questo trucco dell'ottavo bit. Esistono molte varianti della tabella ASCII a 8 bit, ad esempio ISO 8859-1, chiamata anche ISO Latin-1 .

Unicode, The Rise

ASCII Extended risolve il problema per le lingue basate sull'alfabeto latino ... che dire degli altri che necessitano di un alfabeto completamente diverso? Greco? Russo? Cinesi e simili?

Avremmo avuto bisogno di un set di caratteri completamente nuovo ... questo è il razionale dietro Unicode. Unicode non contiene tutti i caratteri di ogni lingua, ma contiene sicuramente una quantità gigantesca di caratteri ( vedi questa tabella ).

Non è possibile salvare il testo sul disco rigido come "Unicode". Unicode è una rappresentazione astratta del testo. Devi "codificare" questa rappresentazione astratta. È qui che entra in gioco una codifica .

Codifiche: UTF-8 vs UTF-16 vs UTF-32

Questa risposta fa un ottimo lavoro nello spiegare le basi:

  • UTF-8 e UTF-16 sono codifiche di lunghezza variabile.
  • In UTF-8, un personaggio può occupare un minimo di 8 bit.
  • In UTF-16, la lunghezza di un carattere inizia con 16 bit.
  • UTF-32 è una codifica a lunghezza fissa di 32 bit.

UTF-8 utilizza il set ASCII per i primi 128 caratteri. È utile perché significa che il testo ASCII è valido anche in UTF-8.

mnemonics:

  • UTF- 8 : minimo 8 bit.
  • UTF- 16 : minimo 16 bit.
  • UTF- 32 : minimo e massimo 32 bit.

Nota:

Perché 2 ^ 7?

Questo è ovvio per alcuni, ma per ogni evenienza. Sono disponibili sette slot riempiti con 0 o 1 ( codice binario ). Ognuno può avere due combinazioni. Se abbiamo sette punti, abbiamo 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128 combinazioni. Pensa a questo come un lucchetto a combinazione con sette ruote, ciascuna con solo due numeri.

Fonte: Wikipedia , questo fantastico post sul blog e Mocki dove inizialmente ho pubblicato questo riassunto.


7
Non c'è testo ma testo codificato. Alcune codifiche sono molto semplici, in particolare per i set di caratteri con <= 256 punti di codice. "Extended ASCII" è un termine molto ambiguo; ce ne sono alcuni che supportano greco, russo e / o polacco. ASCII è insufficiente per il testo inglese, che utilizza á, ü, ç, ñ. Sospetto che sia stato progettato per supportare linguaggi informatici piuttosto che linguaggi umani. Dogmaticamente, quando scrivi un file o un flusso, hai un set di caratteri e scegli una codifica. Il tuo lettore deve ottenere i byte e la conoscenza di quale codifica. In caso contrario, la comunicazione non è riuscita.
Tom Blodget il

Grazie mille per l'addendum. Ho aggiornato la risposta di conseguenza.
Andrew,

Grazie. Ho notato ovunque le tabelle ASCII mostrano i codici carattere come 0-127, ma le tabelle UTF-8 mostrano i codici come esadecimali e non come numeri interi. C'è una ragione per questo? Perché le tabelle UTF-X non mostrano 0-127 / 255/65535 contro 00-AF? Questo significa qualcosa?
wayofthefuture,

Grazie per la tua risposta Domanda rapida: "In UTF-16, la lunghezza di un carattere inizia con 16 bit" - Ciò significa che i caratteri alfanumerici non possono essere rappresentati da UTF-16 poiché sono solo caratteri a 8 bit?
Moondra,

Ottima risposta, ho solo un problema: il polacco usa davvero un alfabeto diverso? Pensavo che usassimo lo stesso inglese, solo con qualche lettera aggiuntiva?
Nicofisi,

89

ASCII ha 128 punti di codice, da 0 a 127. Può stare in un singolo byte a 8 bit, i valori da 128 a 255 tendevano ad essere usati per altri caratteri. Con scelte incompatibili, causando il disastro della tabella codici . Il testo codificato in una tabella codici non può essere letto correttamente da un programma che presuppone o indovina un'altra tabella codici.

Unicode è nato per risolvere questo disastro. La versione 1 è iniziata con 65536 punti di codice, comunemente codificati in 16 bit. Successivamente esteso nella versione 2 a 1,1 milioni di punti di codice. La versione attuale è 6.3, utilizzando 110.187 dei 1,1 milioni di punti di codice disponibili. Questo non si adatta più a 16 bit.

La codifica in 16 bit era comune quando arrivava la v2, utilizzata ad esempio dai sistemi operativi Microsoft e Apple. E runtime linguistici come Java. Le specifiche v2 hanno escogitato un modo per mappare quei 1,1 milioni di punti di codice in 16 bit. Una codifica chiamata UTF-16, una codifica a lunghezza variabile in cui un punto di codice può richiedere 2 o 4 byte. I punti di codice v1 originali prendono 2 byte, quelli aggiunti prendono 4 byte.

Un'altra codifica a lunghezza variabile molto comune, utilizzata nei sistemi operativi e negli strumenti * nix è UTF-8, un punto di codice può richiedere tra 1 e 4 byte, i codici ASCII originali prendono 1 byte, il resto richiede di più. L'unica codifica di lunghezza non variabile è UTF-32, richiede 4 byte per un punto di codice. Non usato spesso poiché è piuttosto dispendioso. Ce ne sono altri, come UTF-1 e UTF-7, ampiamente ignorati.

Un problema con le codifiche UTF-16/32 è che l'ordine dei byte dipenderà dall'endianità della macchina che ha creato il flusso di testo. Quindi aggiungi al mix UTF-16BE, UTF-16LE, UTF-32BE e UTF-32LE.

Avere queste diverse scelte di codifica riporta in una certa misura il disastro della tabella codici, insieme a dibattiti accesi tra i programmatori quale scelta UTF è "migliore". La loro associazione con i valori predefiniti del sistema operativo disegna praticamente le linee. Una contromisura è la definizione di una distinta base, il Byte Order Mark, un punto di codice speciale (U + FEFF, spazio di larghezza zero) all'inizio di un flusso di testo che indica come viene codificato il resto del flusso. Indica sia la codifica UTF che l'endianità ed è neutrale rispetto a un motore di rendering del testo. Sfortunatamente è facoltativo e molti programmatori sostengono il loro diritto di ometterlo, quindi gli incidenti sono ancora abbastanza comuni.


31

java fornisce supporto per Unicode, ovvero supporta tutti gli alfabeti mondiali. Quindi la dimensione del carattere in Java è di 2 byte. E l'intervallo è compreso tra 0 e 65535.

inserisci qui la descrizione dell'immagine


Immagine chiave per spiegare
Ponmari Subramanian

2
Peccato che sia sbagliato. "Codici ASCII (128)" sarebbe corretto.
Mark Tolonen,

15

ASCII ha 128 posizioni di codice, assegnate a caratteri grafici e caratteri di controllo (codici di controllo).

Unicode ha 1.114.112 posizioni di codice. Circa 100.000 di questi sono stati attualmente assegnati a caratteri e molti punti di codice sono stati resi permanentemente non caratteri (ovvero non utilizzati per codificare mai alcun carattere) e la maggior parte dei punti di codice non sono ancora assegnati.

Le uniche cose che ASCII e Unicode hanno in comune sono: 1) Sono codici di caratteri. 2) Le 128 prime posizioni di codice di Unicode sono state definite per avere gli stessi significati di ASCII, tranne per il fatto che le posizioni di codice dei caratteri di controllo ASCII sono definite come caratteri di controllo denotanti, con nomi corrispondenti ai loro nomi ASCII, ma i loro significati sono non definito in Unicode.

A volte, tuttavia, Unicode è caratterizzato (anche nello standard Unicode!) Come "wide ASCII". Questo è uno slogan che cerca principalmente di trasmettere l'idea che Unicode debba essere un codice di carattere universale come una volta era ASCII (sebbene il repertorio di caratteri di ASCII fosse irrimediabilmente insufficiente per un uso universale), al contrario dell'uso di codici diversi in sistemi e applicazioni diversi e per lingue diverse.

Unicode in quanto tale definisce solo la "dimensione logica" dei caratteri: ogni carattere ha un numero di codice in un intervallo specifico. Questi numeri di codice possono essere presentati utilizzando diverse codifiche di trasferimento e internamente, in memoria, i caratteri Unicode sono generalmente rappresentati utilizzando una o due quantità di 16 bit per carattere, a seconda dell'intervallo di caratteri, a volte utilizzando una quantità di 32 bit per carattere.


2
Penso che la codifica più comune per Unicode sia UTF-8 in questi giorni. UTF-8 codifica la maggior parte dei punti di codice in 1, 2 o 3 byte.
Binarus,

14

ASCII e Unicode sono due codifiche di caratteri. Fondamentalmente, sono standard su come rappresentare i caratteri di differenza nei file binari in modo che possano essere scritti, archiviati, trasmessi e letti nei media digitali. La differenza principale tra i due sta nel modo in cui codificano il carattere e il numero di bit che usano per ciascuno. ASCII inizialmente utilizzava sette bit per codificare ciascun carattere. Questo è stato successivamente aumentato a otto con Extended ASCII per ovviare all'apparente inadeguatezza dell'originale. Al contrario, Unicode utilizza un programma di codifica a bit variabile in cui è possibile scegliere tra codifiche a 32, 16 e 8 bit. L'uso di più bit consente di utilizzare più caratteri a spese di file più grandi, mentre un numero inferiore di bit offre una scelta limitata ma consente di risparmiare molto spazio. Usando meno bit (es

Uno dei motivi principali per cui Unicode era il problema derivava dai numerosi programmi ASCII estesi non standard. A meno che non si stia utilizzando la pagina prevalente, utilizzata da Microsoft e dalla maggior parte delle altre società di software, è probabile che si verifichino problemi con i caratteri che compaiono come caselle. Unicode praticamente elimina questo problema poiché tutti i punti del codice carattere sono stati standardizzati.

Un altro grande vantaggio di Unicode è che può contenere al massimo un numero enorme di caratteri. Per questo motivo, Unicode attualmente contiene la maggior parte delle lingue scritte e ha ancora spazio per ancora di più. Ciò include script tipici da sinistra a destra come l'inglese e persino script da destra a sinistra come l'arabo. Il cinese, il giapponese e le molte altre varianti sono rappresentate anche all'interno di Unicode. Quindi Unicode non verrà sostituito presto.

Al fine di mantenere la compatibilità con il vecchio ASCII, che all'epoca era già ampiamente utilizzato, Unicode è stato progettato in modo tale che i primi otto bit corrispondessero a quelli della pagina ASCII più popolare. Quindi, se apri un file codificato ASCII con Unicode, otterrai comunque i caratteri corretti codificati nel file. Ciò ha facilitato l'adozione di Unicode poiché ha ridotto l'impatto dell'adozione di un nuovo standard di codifica per coloro che già utilizzavano ASCII.

Sommario:

1.ASCII uses an 8-bit encoding while Unicode uses a variable bit encoding.
2.Unicode is standardized while ASCII isn’t.
3.Unicode represents most written languages in the world while ASCII does not.
4.ASCII has its equivalent within Unicode.

Tratto da: http://www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs


1

Conservazione

I numeri indicati servono solo per la memorizzazione di 1 carattere

  • ASCII ⟶ 2 7 bit ( 1 byte )
  • ASCII esteso ⟶ 2 8 bit (1 byte)
  • UTF-8 ⟶ minimo 2 8 , massimo 2 32 bit (min 1, max 4 byte)
  • UTF-16 ⟶ minimo 2 16 , massimo 2 32 bit (min 2, max 4 byte)
  • UTF-32 ⟶ 2 32 bit (4 byte)

Utilizzo (da febbraio 2020)

Percentuale di siti Web che utilizzano varie codifiche di caratteri


0

ASCII definisce 128 caratteri, poiché Unicode contiene un repertorio di oltre 120.000 caratteri.


4
-1 per questo banale duplicato "Rispondi" aggiungendo nulla a risposte precedenti molto precedenti. Si prega di non aggiungere disordine duplicato in questo modo (ottenere rappresentante in altri modi che sono legittimi).
cellepo,

-1

Oltre a come UTF è un superset di ASCII, un'altra buona differenza da sapere tra ASCII e UTF è in termini di codifica dei file su disco e rappresentazione e archiviazione dei dati nella memoria casuale. I programmi sanno che i dati dati devono essere intesi come una stringa ASCII o UTF rilevando speciali codici di marcatura dell'ordine di byte all'inizio dei dati o assumendo dal programmatore l'intenzione che i dati siano di testo e quindi controllandoli per schemi che indicano che lo è in una codifica di testo o in un'altra.

Usando la notazione convenzionale del prefisso 0xper i dati esadecimali, un buon riferimento di base è che il testo ASCII inizia con valori di byte 0x00per 0x7Frappresentare uno dei possibili valori di carattere ASCII . Il testo UTF è normalmente indicato iniziando con i byte 0xEF 0xBB 0xBFper UTF8. Per UTF16, avviare byte 0xFE 0xFFo0xFF 0xFE vengono utilizzati, con l'ordine di di testo indicati dall'ordine dei byte iniziali. La semplice presenza di valori di byte che non rientrano nell'intervallo ASCII di possibili valori di byte indica anche che i dati sono probabilmente UTF.

Esistono altri segni di ordine dei byte che utilizzano codici diversi per indicare che i dati devono essere interpretati come testo codificato in un determinato standard di codifica.

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.