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?
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?
Risposte:
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).
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 0a
feed di riga.
a
, utilizzerà due byte (o un multiplo di due).
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.
In UTF-8, i caratteri ASCII usano un byte, gli altri caratteri usano due, tre o quattro byte.
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.
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.
File 8.1 / Stati Uniti di Windows 8.1 con una 'a' salvata con blocco note.
File con un singolo 'ա' salvato con il blocco note
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.
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.