Perché i caratteri inglesi richiedono meno byte per rappresentare rispetto ad altri alfabeti?


31

Quando inserisco 'a' in un file di testo, lo rende 2 byte, ma quando lo inserisco, diciamo 'ա', che è una lettera dell'alfabeto armeno, lo rende 3 byte.

Qual è la differenza tra alfabeti per un computer?
Perché l'inglese occupa meno spazio?


22
Dovresti leggere questo articolo del fondatore di StackExchange: joelonsoftware.com/articles/Unicode.html
Eric Lippert

22
Non penso che esista "caratteri inglesi". Sono romani.
Raffaello,

5
@Raphael tutti sanno a cosa si riferisce però. Ma bello aggiungere.
Mathias Lykkegaard Lorenzen,

1
@Raphael In realtà ci sono molte lettere romane che non sono usate in inglese e quindi non sono incluse nel set di caratteri ASCII. Molti di questi includono modificatori, ma sono ancora necessari per rendere correttamente il testo in varie lingue di origine latina diverse dall'inglese.
Wutaz,

7
@Raphael Non penso che esista "personaggi romani". Sono latini.
Blacklight Shining

Risposte:


41

Uno dei primi schemi di codifica sviluppati per l'uso nei computer tradizionali è lo standard ASCII ( American Standard Code for Information Interchange ). È stato sviluppato negli anni '60 negli Stati Uniti.

L'alfabeto inglese utilizza parte dell'alfabeto latino (ad esempio, ci sono poche parole accentate in inglese). Ci sono 26 lettere individuali in quell'alfabeto, senza considerare il caso. E dovrebbero esistere anche i singoli numeri e segni di punteggiatura in qualsiasi schema che finge di codificare l'alfabeto inglese.

Gli anni '60 erano anche un periodo in cui i computer non avevano la quantità di memoria o spazio su disco che abbiamo ora. ASCII è stato sviluppato per essere una rappresentazione standard di un alfabeto funzionale su tutti i computer americani. All'epoca, la decisione di rendere ogni carattere ASCII lungo 8 bit (1 byte) fu presa a causa dei dettagli tecnici dell'epoca (l'articolo di Wikipedia menziona il fatto che il nastro perforato conteneva 8 bit in una posizione alla volta). In effetti, lo schema ASCII originale può essere trasmesso utilizzando 7 bit, gli otto potrebbero essere utilizzati per i controlli di parità. Gli sviluppi successivi hanno ampliato lo schema originale ASCII per includere diversi caratteri accentati, matematici e terminali.

Con il recente aumento dell'uso del computer in tutto il mondo, sempre più persone di diverse lingue hanno avuto accesso a un computer. Ciò significava che, per ciascuna lingua, dovevano essere sviluppati nuovi schemi di codifica, indipendentemente da altri schemi, che sarebbero in conflitto se letti da terminali di lingue diverse.

Unicode è venuto come una soluzione all'esistenza di diversi terminali, unendo tutti i possibili personaggi significativi in ​​un unico set di caratteri astratto.

UTF-8 è un modo per codificare il set di caratteri Unicode. È una codifica a larghezza variabile (ad esempio caratteri diversi possono avere dimensioni diverse) ed è stata progettata per la compatibilità all'indietro con il precedente schema ASCII. Pertanto, il set di caratteri ASCII rimarrà grande un byte, mentre tutti gli altri caratteri avranno due o più byte. UTF-16 è un altro modo per codificare il set di caratteri Unicode. In confronto a UTF-8, i caratteri sono codificati come un insieme di una o due unità di codice a 16 bit.

Come indicato nei commenti, il carattere "a" occupa un singolo byte mentre "ա" occupa due byte, indicando una codifica UTF-8. Il byte in più nella tua domanda era dovuto all'esistenza di un carattere di nuova riga alla fine (che l'OP ha scoperto).


26
Non esiste un ultimo byte che codifica la fine del file, in qualsiasi normale codifica o formato di file. Quando un programma legge un file, la fine del file potrebbe essere segnalata dal sistema operativo in un modo speciale, ma questo è un problema diverso.
Jukka K. Korpela,

2
Il carattere ա è 2 byte (0xD5A1) nella versione UTF-8 di Unicode; il carattere extra (qualunque cosa sia) è presente in entrambi i file. marathon-studios.com/unicode/U0561/Armenian_Small_Letter_Ayb
Dan Neely

6
@khajvah Se lo fai echo 'ա' > file.txt, o modifica il file usando alcuni editor, dopo aggiungono automaticamente una nuova riga. Se esegui xxd file.txt, l'ultimo byte sarà probabilmente un 0afeed di riga.
Daniel Beck

7
@DoktoroReichard: chiarire nella risposta che Unicode non è una codifica; piuttosto, è un set di caratteri astratto e UTF-16 e UTF-8 sono codifiche di punti di codice Unicode. Gli ultimi paragrafi della tua risposta parlano principalmente di UTF-8. Ma se un file utilizza UTF-16, qualsiasi punto di codice, anche quello per a, utilizzerà due byte (o un multiplo di due).
Grawity

6
Vale probabilmente anche la pena sottolineare che i set di caratteri "ASCII estesi" non sono affatto ASCII, e il numero di modi diversi di utilizzare l'ottavo bit rende tutto un gran casino. Basta usare UTF-8 invece.
ntoskrnl,

17

1 byte è 8 bit e può quindi rappresentare fino a 256 (2 ^ 8) valori diversi.

Per le lingue che richiedono più possibilità di questa, non è possibile mantenere una semplice mappatura da 1 a 1, quindi sono necessari più dati per memorizzare un carattere.

In genere, la maggior parte delle codifiche utilizza i primi 7 bit (128 valori) per i caratteri ASCII . Ciò lascia l'ottavo bit, o 128 più valori per più caratteri. . . aggiungi caratteri accentati, lingue asiatiche, cirillico, ecc. e puoi facilmente capire perché 1 byte non è sufficiente per conservare tutti i caratteri.


quindi ecco l'unica risposta che spiega in realtà perché viene utilizzato più spazio
Félix Gagnon-Grenier,

10

In UTF-8, i caratteri ASCII usano un byte, gli altri caratteri usano due, tre o quattro byte.


1
Puoi approfondire il motivo per cui questo è? notare due metodi di codifica non risponde alla domanda.
MaQleod,

@MaQleod Unicode è stato creato per sostituire ASCII. Per compatibilità con le versioni precedenti, i primi 128 caratteri sono uguali. Questi 128 caratteri possono essere espressi con un byte. Vengono aggiunti byte aggiuntivi per caratteri aggiuntivi.
Jason,

Sono consapevole, ma questo fa parte della risposta alla domanda su ciò che rende diversi i caratteri ASCII. Dovrebbe essere spiegato al PO.
MaQleod,

@MaQleod Si potrebbe anche dire che il Consorzio Unicode era principalmente composto da società americane ed era orientato verso i caratteri di lingua inglese. Pensavo che una risposta semplice fosse migliore di una soggettiva.
Jason,

15
Non "in Unicode", in UTF8, che è solo una delle numerose codifiche del set di caratteri Unicode.
Sebastian Negraszus,

3

La quantità di byte richiesti per un carattere (di cui apparentemente si tratta la domanda) dipende dalla codifica del carattere. Se si utilizza la codifica ArmSCII, ogni lettera armena occupa solo un byte. Oggi non è una buona scelta.

Nella codifica di trasferimento UTF-8 per Unicode, i caratteri necessitano di un diverso numero di byte. In esso, "a" richiede solo un byte (l'idea di due byte è una sorta di confusione), "á" richiede due byte e la lettera armena ayb "ա" richiede anche due byte. Tre byte devono essere una sorta di confusione. Al contrario, ad esempio la lettera bengalese a "অ" richiede tre byte in UTF-8.

Lo sfondo è semplicemente che UTF-8 è stato progettato per essere molto efficiente per i personaggi Ascii, abbastanza efficiente per i sistemi di scrittura in Europa e dintorni, e tutto il resto è meno efficiente. Ciò significa che le lettere latine di base (che sono costituite principalmente dal testo inglese), è necessario solo un byte per un carattere; per greco, cirillico, armeno e pochi altri sono necessari due byte; tutto il resto ha bisogno di più.

UTF-8 ha (come sottolineato in un commento) anche l'utile proprietà che i dati di Ascii (quando rappresentati come unità a 8 bit, che è stata quasi l'unica via per molto tempo) è anche banalmente codificata UTF-8.


Grazie per la risposta. I byte aggiuntivi sono perché il programma che ho usato ha aggiunto automaticamente un nuovo carattere di linea alla fine.
Khajvah,

1
Non credo che UTF-8 sia stato progettato tanto per l' efficienza con i dati ASCII quanto per la compatibilità . UTF-8 ha la proprietà molto bella che il contenuto ASCII a 7 bit (con il bit alto impostato su zero) è identico allo stesso contenuto codificato come UTF-8, quindi per gli strumenti che normalmente si occupano di ASCII, è una sostituzione drop-in . A quanto mi risulta, nessun altro schema di codifica Unicode ha questa proprietà. UTF-8 è anche ragionevolmente compatto per la maggior parte dei dati, in particolare se si rimane all'interno del regno del BMP Unicode .
un CVn

1
@ MichaelKjörling, ho aggiunto un riferimento a quella funzione. Tuttavia, una delle principali obiezioni a Unicode nei primi tempi era l'inefficienza e UTF-16 raddoppia la dimensione dei dati che è prevalentemente Ascii. UTF-8 significa, ad esempio, per il testo inglese, che "paghi" solo per i caratteri non Ascii che usi.
Jukka K. Korpela,

3

I codici dei caratteri negli anni '60 (e molto oltre) erano specifici per le macchine. Negli anni '80 ho usato brevemente una macchina DEC 2020, con parole a 36 bit e 5, 6 e 8 bit ( IIRC ) per codifica dei caratteri. Prima di allora, ho usato una serie IBM 370 con EBCDIC. ASCII a 7 bit ha portato ordine, ma ha avuto un pasticcio con le "codepage" dei PC IBM che usano tutti e 8 i bit per rappresentare caratteri extra, come tutti i tipi di riquadri per disegnare menu primitivi, e successivamente estensioni ASCII come Latin-1 (8 bit codifiche, con i primi 7 bit come ASCII e l'altra metà per "caratteri nazionali" come ñ, Ço altri. Probabilmente il più popolare era il latino-1, adattato all'inglese e alla maggior parte delle lingue europee usando caratteri latini (e accenti e varianti).

Scrivere il mixaggio di testo, ad esempio inglese e spagnolo, è andato bene (basta usare il latino-1, superset di entrambi), ma mescolare tutto ciò che utilizzava una codifica diversa (diciamo includere uno snippet di greco o russo, per non parlare di una lingua asiatica come il giapponese) era un vero incubo. La cosa peggiore era che il russo e in particolare il giapponese e il cinese avevano diverse codifiche popolari, completamente incompatibili.

Oggi usiamo Unicode, che è associato a codifiche efficienti come UTF-8 che favoriscono i caratteri inglesi (sorprendentemente, la codifica per le lettere inglesi corrisponde a ASCII), facendo sì che molti caratteri non inglesi usino codifiche più lunghe.


2

File 8.1 / Stati Uniti di Windows 8.1 con una 'a' salvata con blocco note.

  • Salva AS ANSI 1 byte
  • Salva AS Unicode 4 byte
  • Salva AS UTF-8 4 byte

File con un singolo 'ա' salvato con il blocco note

  • Salvare AS ANSI non è possibile
  • Salva AS Unicode 4 byte
  • Salva AS UTF-8 5 byte

Una singola "a" è codificata come un singolo byte in ANSI, in Unicode ogni carattere è in genere di 2 byte, inoltre c'è anche una DBA (Marker di ordine dei byte) a 2 byte all'inizio del file. UTF-8 ha una DBA a 3 byte e il carattere a byte singolo.

Per "ա" quel carattere non esiste nel set di caratteri ANSI e non può essere salvato sulla mia macchina. Il file Unicode è lo stesso di prima e il file UTF-8 ha una dimensione di 1 byte maggiore poiché il carattere richiede 2 byte.

Se la macchina proviene da una regione diversa, è possibile che sia installata una tabella codici OEM diversa con glifi diversi per i 255 caratteri possibili nell'intervallo ASCII. Come menzionato da @ntoskrnl, la tabella codici OEM per la mia macchina sarebbe Windows-1252, che è l'impostazione predefinita per l'inglese americano.


4
Notepad (e Windows in generale) usa una terminologia confusa qui. "ANSI" è una codifica a byte singolo dipendente dalla locale (Windows-1252 nelle versioni inglesi) e "Unicode" è UTF-16.
ntoskrnl,

@ntoskrnl Questo è corretto, ma se stai cercando nella casella di riepilogo per la codifica, dice ANSI, motivo per cui ho menzionato se hai una tabella codici OEM diversa potresti ottenere risultati diversi.
Darryl Braaten,

2

Se sei interessato a come sono memorizzati i personaggi, puoi andare su www.unicode.org e guardarti intorno. Nella parte superiore della loro pagina principale è presente un collegamento "Grafici di codice" che mostra tutti i codici dei caratteri disponibili in Unicode.

Tutto sommato, ci sono poco più di un milione di codici disponibili in Unicode (non tutti vengono utilizzati). Un byte può contenere 256 valori diversi, quindi occorrerebbero tre byte se si desidera memorizzare ogni possibile codice Unicode.

Invece, Unicode è generalmente memorizzato nella codifica "UTF-8" che utilizza meno byte per alcuni caratteri e più per altri. I primi 128 valori di codice sono memorizzati in un singolo byte, fino ai primi 2048 valori di codice sono memorizzati in due byte, fino a 65536 sono memorizzati in tre byte e il resto richiede quattro byte. Questo è stato organizzato in modo che i valori di codice utilizzati più spesso occupino meno spazio. AZ, az, 0-9 e! @ $% ^ & * () - [} {}; ': "|,. / <>? E alcuni che ho dimenticato di prendere un byte; quasi tutto l'inglese, il 98% di Il tedesco e il francese (solo indovinando) possono essere memorizzati in un byte per carattere, e questi sono i caratteri più utilizzati: cirillico, greco, ebraico, arabo e alcuni altri usano due byte per carattere. Lingue indiane, la maggior parte di cinese, giapponese , Coreano, tailandese, tonnellate di simboli matematici, può essere scritto in tre byte per carattere. Le cose rare (se mai vuoi scrivere un testo in Lineare A o Lineare B, Emoji) richiedono quattro byte.

Un'altra codifica è UTF-16. Tutto ciò che richiede 1, 2 o 3 byte in UTF-8 richiede due byte in UTF-16. Questo è un vantaggio se hai testo cinese o giapponese con pochissimi caratteri latini in mezzo.

Informazioni sui motivi del design UTF-8: presenta numerosi vantaggi rispetto ad altri design. Loro sono:

Compatibilità con caratteri US-ASCII

Ragionevole compattezza

Auto-sincronizzazione: questo significa che se ti viene data parte di una sequenza di byte che sono caratteri nella codifica UTF-8, puoi scoprire dove inizia il carattere. In alcune codifiche, sia xy che yx potrebbero essere codifiche valide di caratteri, quindi se ti viene data parte di una sequenza ... xxyxyxyxyxy ... non puoi sapere quali caratteri hai.

Corretto ordinamento: se si ordinano le stringhe contenenti caratteri codificati UTF-8 in base ai loro valori byte, vengono automaticamente ordinate correttamente in base ai loro valori Unicode.

Compatibile con il codice a byte singolo: la maggior parte del codice che assume valori a byte singolo funziona automaticamente correttamente con caratteri codificati UTF-8.

Inoltre, qualunque sia la ragione che ho dimenticato.

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.