Unicode o Unicode (dalla parola inglese Unicode) è uno standard di codifica dei caratteri. Consente di codificare quasi tutte le lingue scritte.
Alla fine degli anni '80, il ruolo dello standard è stato assegnato ai caratteri a 8 bit. Le codifiche a 8 bit erano rappresentate da varie modifiche, il cui numero era in costante crescita. Questo è stato principalmente il risultato di un'espansione attiva della gamma di lingue utilizzate. C'era anche il desiderio degli sviluppatori di inventare una codifica che rivendicasse almeno un'universalità parziale.
Di conseguenza, è diventato necessario affrontare diversi problemi:
- problemi con la visualizzazione di documenti con codifica errata. Potrebbe essere risolto introducendo in modo coerente metodi per specificare la codifica utilizzata o introducendo una codifica unica per tutti;
- problemi di limitazione dei pacchetti di caratteri, risolti sia cambiando i font nel documento, sia introducendo una codifica estesa;
- il problema della conversione di una codifica dall'una all'altra, che sembrava possibile risolvere o utilizzando una trasformazione intermedia (terza codifica) che includa caratteri di codifiche diverse, oppure compilando tabelle di conversione per ogni due codifiche;
- problemi di duplicazione dei singoli font. Tradizionalmente, si presumeva che ogni codifica avesse il proprio carattere, anche quando le codifiche corrispondevano completamente o parzialmente nel set di caratteri. In una certa misura, il problema è stato risolto con l'aiuto di caratteri "grandi", dai quali sono stati quindi selezionati i caratteri necessari per una particolare codifica. Ma per determinare il grado di conformità è stato necessario creare un unico registro di simboli.
Pertanto, la questione della necessità di creare una codifica unificata "ampia" era all'ordine del giorno. Le codifiche a lunghezza di carattere variabile utilizzate nel sud-est asiatico sembravano troppo difficili da applicare. Pertanto, l'enfasi è stata posta sull'utilizzo di un carattere che ha una larghezza fissa. I caratteri a 32 bit sembravano troppo ingombranti e alla fine quelli a 16 bit hanno vinto.
Lo standard è stato proposto alla comunità Internet nel 1991 da un'organizzazione senza scopo di lucro "Consorzio Unicode". Il suo utilizzo permette di codificare un gran numero di caratteri di diversi tipi di scrittura. Nei documenti Unicode, né i caratteri cinesi, né i simboli matematici, né il cirillico, né il latino sono molto vicini. Allo stesso tempo, le codepage non richiedono alcuna commutazione durante il funzionamento.
Lo standard si compone di due sezioni principali: il set di caratteri universale (inglese UCS) e la famiglia di codifiche (nell'interpretazione inglese - UTF). Il set di caratteri universale definisce una proporzionalità inequivocabile ai codici dei caratteri. I codici in questo caso sono elementi della sfera del codice, che sono numeri interi non negativi. La funzione di una famiglia di codifica è quella di definire la rappresentazione macchina di una sequenza di codici UCS.
Nello standard Unicode, i codici sono classificati in diverse aree. Area con codici che iniziano con U+0000 e terminano con U+007F - include i caratteri dell'ASCII impostati con i codici richiesti. Inoltre ci sono aree di simboli di diverse scritture, simboli tecnici, segni di punteggiatura. Un lotto separato di codici viene tenuto in riserva per un uso futuro. Per il cirillico sono definite le seguenti aree di caratteri con codici: U+0400 - U+052F, U+2DE0 - U+2DFF, U+A640 - U+A69F.
Il valore di questa codifica nello spazio web cresce inesorabilmente. La quota di siti che utilizzano Unicode era quasi il 50 percento all'inizio del 2010.
Oggi parleremo con te della provenienza di krakozyabry sul sito e nei programmi, quali codifiche di testo esistono e quali dovrebbero essere utilizzate. Diamo un'occhiata più da vicino alla storia del loro sviluppo, partendo dall'ASCII di base, così come le sue versioni estese CP866, KOI8-R, Windows 1251, e terminando con le moderne codifiche dell'Unicode Consortium UTF 16 e 8. Contenuti:
- Versioni estese di Asuka - codifiche CP866 e KOI8-R
- Windows 1251: una variazione di ASCII e perché vengono visualizzati i bug
ASCII - codifica del testo di base per il latino
Lo sviluppo delle codifiche di testo è avvenuto contemporaneamente alla formazione del settore IT e durante questo periodo sono riusciti a subire molti cambiamenti. Storicamente, tutto è iniziato con EBCDIC, che era piuttosto dissonante nella pronuncia russa, che consentiva di codificare lettere dell'alfabeto latino, numeri arabi e segni di punteggiatura con caratteri di controllo. Tuttavia, il punto di partenza per lo sviluppo delle moderne codifiche di testo dovrebbe essere considerato il famoso ASCII(Codice standard americano per lo scambio di informazioni, che in russo viene solitamente pronunciato come "aski"). Descrive i primi 128 caratteri più comunemente usati dagli utenti di lingua inglese: lettere latine, numeri arabi e segni di punteggiatura. Anche in questi 128 caratteri descritti in ASCII, c'erano alcuni caratteri di servizio come parentesi, barre, asterischi, ecc. In realtà, puoi vederli tu stesso:![](https://i0.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/15fe1a.png)
![](https://i0.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/0a7d12.png)
Versioni estese di Asuka - codifiche CP866 e KOI8-R con pseudografica
Quindi, abbiamo iniziato a parlare di ASCII, che era, per così dire, il punto di partenza per lo sviluppo di tutte le moderne codifiche (Windows 1251, Unicode, UTF 8). Inizialmente conteneva solo 128 caratteri dell'alfabeto latino, numeri arabi e qualcos'altro, ma nella versione estesa è diventato possibile utilizzare tutti i 256 valori che possono essere codificati in un byte di informazioni. Quelli. è diventato possibile aggiungere ad Asci i caratteri delle lettere della tua lingua. Qui sarà necessario divagare ancora per spiegare - perché hai bisogno di codifiche di testo e perché è così importante. I simboli sullo schermo del tuo computer sono formati sulla base di due cose: insiemi di forme vettoriali (rappresentazioni) di tutti i tipi di caratteri (si trovano in file con caratteri installati sul tuo computer) e un codice che ti consente di estrarre esattamente quello di questo set di forme vettoriali (file di font).carattere da inserire nella posizione corretta. È chiaro che i caratteri sono responsabili dei moduli vettoriali stessi, ma il sistema operativo e i programmi utilizzati in esso sono responsabili della codifica. Quelli. qualsiasi testo sul tuo computer sarà un insieme di byte, ognuno dei quali codifica un singolo carattere di questo stesso testo. Il programma che visualizza questo testo sullo schermo (editor di testo, browser, ecc.), durante l'analisi del codice, legge la codifica del carattere successivo e cerca la forma vettoriale corrispondente nel file di font desiderato che è collegato per visualizzare questo testo documento. Tutto è semplice e banale. Ciò significa che per codificare qualsiasi carattere di cui abbiamo bisogno (ad esempio, dall'alfabeto nazionale), devono essere soddisfatte due condizioni: la forma vettoriale di questo carattere deve essere nel carattere utilizzato e questo carattere potrebbe essere codificato in codifiche ASCII estese in un byte. Pertanto, ci sono un sacco di tali opzioni. Solo per la codifica dei caratteri della lingua russa, esistono diverse varietà di Aska esteso. Ad esempio, inizialmente c'era CP866, in cui era possibile utilizzare i caratteri dell'alfabeto russo ed era una versione estesa dell'ASCII. Quelli. la sua parte superiore coincideva completamente con la versione base di Asuka (128 caratteri latini, numeri e altre schifezze), che è mostrata nello screenshot appena sopra, ma la parte inferiore della tabella con la codifica CP866 aveva la forma mostrata nello screenshot appena sotto e ha permesso di codificare altri 128 segni (lettere russe e tutti i tipi di pseudografici lì):![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/a1391c.png)
![](https://i0.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/73e6b5.png)
Windows 1251: la versione moderna di ASCII e perché krakozyabry esegue la scansione
L'ulteriore sviluppo delle codifiche di testo era dovuto al fatto che i sistemi operativi grafici stavano guadagnando popolarità e la necessità di utilizzare la pseudografia in essi è scomparsa nel tempo. Di conseguenza, nacque un intero gruppo, che, in sostanza, erano ancora versioni estese di Asuka (un carattere di testo è codificato con un solo byte di informazioni), ma senza l'uso di caratteri pseudografici. Appartenevano alle cosiddette codifiche ANSI, sviluppate dall'American Standards Institute. Nel linguaggio comune, il nome cirillico veniva utilizzato anche per la variante con supporto per la lingua russa. Un esempio di questo può essere Windows 1251. Si confronta favorevolmente con CP866 e KOI8-R precedentemente utilizzati in quanto il posto dei simboli pseudografici in esso è stato preso dai simboli mancanti della tipografia russa (a parte il segno di accento), nonché dai simboli usati nelle lingue slave vicino a Russo (ucraino, bielorusso, ecc.):![](https://i2.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/963d34.png)
![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/1443f6.png)
Unicode (Unicode) - codifiche universali UTF 8, 16 e 32
Queste migliaia di caratteri del gruppo linguistico del sud-est asiatico non potevano essere descritte in alcun modo in un byte di informazioni, allocato per la codifica dei caratteri nelle versioni estese di ASCII. Di conseguenza, un consorzio chiamato Unicode(Unicode - Unicode Consortium) con la collaborazione di molti leader del settore IT (coloro che producono software, che codificano hardware, che creano font), che erano interessati all'emergere di una codifica del testo universale. La prima variazione rilasciata sotto gli auspici dell'Unicode Consortium è stata UTF-32. Il numero nel nome della codifica indica il numero di bit utilizzato per codificare un carattere. 32 bit sono 4 byte di informazioni che saranno necessarie per codificare un singolo carattere nel nuovo UTF di codifica universale. Di conseguenza, lo stesso file con testo, codificato nella versione estesa di ASCII e in UTF-32, in quest'ultimo caso avrà una dimensione (peso) quattro volte maggiore. Questo è un male, ma ora abbiamo l'opportunità di codificare usando UTF il numero di caratteri pari a due alla potenza di trenta secondi ( miliardi di caratteri, che coprirà qualsiasi valore realmente necessario con un margine enorme). Ma molti paesi con lingue del gruppo europeo non avevano affatto bisogno di utilizzare un numero così grande di caratteri nella codifica, tuttavia, quando si utilizzava UTF-32, avrebbero quadruplicato il peso dei documenti di testo per niente e, di conseguenza, un aumento del volume del traffico Internet e del volume dei dati archiviati. Questo è molto, e nessuno potrebbe permettersi tali sprechi. Come risultato dello sviluppo di Unicode, UTF-16, che si è rivelato un tale successo che è stato accettato come spazio di base predefinito per tutti i caratteri che utilizziamo. Utilizza due byte per codificare un carattere. Vediamo come appare questa cosa. Nel sistema operativo Windows, puoi seguire il percorso "Start" - "Programmi" - "Accessori" - "Utilità" - "Tabella dei caratteri". Di conseguenza, si aprirà una tabella con le forme vettoriali di tutti i caratteri installati nel sistema. Se selezioni il set di caratteri Unicode nelle "Opzioni avanzate", puoi vedere per ogni carattere individualmente l'intera gamma di caratteri inclusi in esso. A proposito, cliccando su uno qualsiasi di essi, puoi vedere il suo doppio byte codice in formato UTF-16, composto da quattro cifre esadecimali:![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/eb4be3.png)
Krakozyabry invece delle lettere russe: come risolvere
Vediamo ora come appaiono i krakozyabras al posto del testo, o, in altre parole, come viene scelta la codifica corretta per il testo russo. In realtà, è impostato nel programma in cui crei o modifichi questo stesso testo o codice usando frammenti di testo. Per la modifica e la creazione di file di testo, personalmente utilizzo un ottimo, a mio avviso, editor HTML e PHP Notepad ++. Tuttavia, può evidenziare la sintassi di un buon centinaio di linguaggi di programmazione e markup in più e ha anche la possibilità di essere esteso utilizzando i plug-in. Leggi una recensione dettagliata di questo meraviglioso programma al link qui sotto. Nel menu in alto di Notepad ++ è presente una voce "Codifiche", dove avrai la possibilità di convertire un'opzione esistente in quella utilizzata di default sul tuo sito:![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/f7e151.png)
Unicode è un mondo molto grande e complesso, perché lo standard permette di rappresentare e lavorare su un computer con tutti i principali script del mondo. Alcuni sistemi di scrittura esistono da più di mille anni e molti di essi si sono sviluppati quasi indipendentemente l'uno dall'altro in diverse parti del mondo. Le persone hanno escogitato così tante cose e spesso è così diverso l'uno dall'altro che è stato un compito estremamente difficile e ambizioso combinare tutto questo in un unico standard.
Per capire davvero Unicode, devi almeno immaginare superficialmente le caratteristiche di tutti gli script con cui lo standard ti consente di lavorare. Ma è davvero necessario per ogni sviluppatore? Diremo di no. Per utilizzare Unicode nella maggior parte delle attività quotidiane, è sufficiente avere un minimo di conoscenza ragionevole e quindi approfondire lo standard secondo necessità.
In questo articolo parleremo dei principi di base di Unicode ed evidenzieremo quegli importanti problemi pratici che gli sviluppatori dovranno sicuramente affrontare nel loro lavoro quotidiano.
Perché è necessario Unicode?
Prima dell'avvento di Unicode, le codifiche a byte singolo erano quasi universalmente utilizzate, in cui il confine tra i caratteri stessi, la loro rappresentazione nella memoria del computer e la visualizzazione sullo schermo erano piuttosto condizionali. Se hai lavorato con l'una o l'altra lingua nazionale, i caratteri di codifica corrispondenti sono stati installati sul tuo sistema, il che ti ha permesso di disegnare byte dal disco sullo schermo in modo tale che avessero un senso per l'utente.
Se hai stampato un file di testo su una stampante e hai visto una serie di krakozyabr incomprensibili su una pagina di carta, ciò significava che i caratteri appropriati non sono stati caricati nella stampante e interpreta i byte non come vorresti.
Questo approccio in generale e le codifiche a byte singolo in particolare presentavano una serie di svantaggi significativi:
- Era possibile lavorare contemporaneamente solo con 256 caratteri, e i primi 128 erano riservati ai caratteri latini e di controllo, e nella seconda metà, oltre ai caratteri dell'alfabeto nazionale, era necessario trovare posto per i caratteri pseudografici ( ╔ ╗).
- I caratteri erano legati a una codifica specifica.
- Ogni codifica rappresentava il proprio insieme di caratteri e la conversione dall'uno all'altro era possibile solo con perdite parziali, quando i caratteri mancanti venivano sostituiti con caratteri graficamente simili.
- Il trasferimento di file tra dispositivi con diversi sistemi operativi è stato difficile. Era necessario avere un programma di conversione o trasportare caratteri aggiuntivi insieme al file. L'esistenza di Internet come la conosciamo era impossibile.
- Nel mondo esistono sistemi di scrittura non alfabetici (scrittura geroglifica), che in linea di principio non sono rappresentabili in una codifica a byte singolo.
Fondamenti di Unicode
Capiamo tutti perfettamente che il computer non conosce entità ideali, ma opera con bit e byte. Ma i sistemi informatici sono ancora creati dalle persone, non dalle macchine, ea volte è più conveniente per te e per me operare con concetti speculativi, per poi passare dall'astratto al concreto.
Importante! Uno dei principi centrali nella filosofia di Unicode è una chiara distinzione tra i caratteri, la loro rappresentazione su un computer e la loro visualizzazione su un dispositivo di output.
Viene introdotto il concetto di carattere Unicode astratto, che esiste solo sotto forma di concetto speculativo e accordo tra le persone, fissato dallo standard. A ogni carattere Unicode viene assegnato un numero intero non negativo chiamato punto di codice.
Quindi, ad esempio, il carattere Unicode U+041F è la lettera cirillica maiuscola P. Esistono diversi modi per rappresentare questo carattere nella memoria del computer, nonché diverse migliaia di modi per visualizzarlo sullo schermo del monitor. Ma allo stesso tempo P, sarà P o U + 041F in Africa.
Questo è il noto incapsulamento o separazione dell'interfaccia dall'implementazione, un concetto che si è dimostrato valido nella programmazione.
Si scopre che, guidato dallo standard, qualsiasi testo può essere codificato come una sequenza di caratteri Unicode
Ciao U+041F U+0440 U+0438 U+0432 U+0435 U+0442
scrivilo su un pezzo di carta, imballalo in una busta e invialo in qualsiasi parte della Terra. Se sanno dell'esistenza di Unicode, il testo verrà percepito da loro esattamente nello stesso modo in cui lo facciamo con te. Non avranno il minimo dubbio che il penultimo carattere sia proprio il minuscolo cirillico e(U+0435) piuttosto che dire latino piccolo e(U+0065). Si noti che non abbiamo detto una parola sulla rappresentazione dei byte.
Spazio codice Unicode
Lo spazio di codice Unicode è costituito da 1.114.112 punti di codice che vanno da 0 a 10FFFF. Di questi, solo 128.237 sono stati assegnati valori dalla nona versione dello standard.Parte dello spazio è riservato ad uso privato e l'Unicode Consortium si impegna a non assegnare mai valori a posizioni provenienti da queste aree speciali.
Per comodità, l'intero spazio è diviso in 17 piani (ora ne sono coinvolti sei). Fino a poco tempo era consuetudine dire che molto probabilmente si doveva avere a che fare solo con il Basic Multilingual Plane (BMP), che include caratteri Unicode da U+0000 a U+FFFF. (Andando un po' avanti: i caratteri di BMP sono rappresentati in UTF-16 da due byte, non quattro). Nel 2016 questa tesi è già in dubbio. Quindi, ad esempio, i personaggi Emoji popolari potrebbero essere trovati in un messaggio dell'utente e devi essere in grado di elaborarli correttamente.
Codifiche
Se vogliamo inviare testo su Internet, dobbiamo codificare una sequenza di caratteri Unicode come sequenza di byte.
Lo standard Unicode include una descrizione di una serie di codifiche Unicode, come UTF-8 e UTF-16BE/UTF-16LE, che consentono di codificare l'intero spazio dei punti di codice. La conversione tra queste codifiche può essere effettuata liberamente senza perdita di informazioni.
Inoltre, nessuno ha annullato le codifiche a byte singolo, ma ti consentono di codificare il tuo pezzo individuale e molto ristretto dello spettro Unicode - 256 o meno posizioni di codice. Per tali codifiche esistono e sono disponibili a tutti delle tabelle, dove ogni valore di un singolo byte è associato a un carattere Unicode (vedi, ad esempio, CP1251.TXT). Nonostante le limitazioni, le codifiche a byte singolo si rivelano molto pratiche quando si tratta di lavorare con una vasta gamma di informazioni testuali monolingue.
Delle codifiche Unicode su Internet, UTF-8 è la più comune (ha vinto il palmares nel 2008), principalmente per la sua economia e la compatibilità trasparente con ASCII a sette bit. Simboli latini e di servizio, segni di punteggiatura e numeri di base, ad es. tutti i caratteri ASCII a sette bit sono codificati in UTF-8 con un byte, lo stesso che in ASCII. I simboli di molti script di base, a parte alcuni caratteri geroglifici più rari, sono rappresentati in esso da due o tre byte. La più grande delle posizioni di codice definite dallo standard - 10FFFF - è codificata con quattro byte.
Si noti che UTF-8 è una codifica a lunghezza variabile. Ogni carattere Unicode in esso contenuto è rappresentato da una sequenza di quanti di codice con una lunghezza minima di un quanti. Il numero 8 indica la lunghezza in bit del quanto di codice (unità di codice) - 8 bit. Per la famiglia di codifica UTF-16, la dimensione del quanto di codice è, rispettivamente, di 16 bit. Per UTF-32 - 32 bit.
Se stai inviando una pagina HTML con testo cirillico sulla rete, UTF-8 può dare un guadagno molto tangibile, perché. tutto il markup, così come i blocchi JavaScript e CSS, verranno effettivamente codificati in un byte. Ad esempio, la pagina principale di Habr in UTF-8 occupa 139 Kb e in UTF-16 è già 256 Kb. Per fare un confronto, se usi win-1251 con la perdita della possibilità di salvare alcuni caratteri, la dimensione verrà ridotta di soli 11 Kb.
Le applicazioni utilizzano spesso codifiche Unicode a 16 bit per memorizzare informazioni sulle stringhe grazie alla loro semplicità e al fatto che i caratteri dei principali sistemi di scrittura del mondo sono codificati in un quanto a sedici bit. Quindi, ad esempio, Java utilizza con successo UTF-16 per la rappresentazione interna delle stringhe. Il sistema operativo Windows internamente utilizza anche UTF-16.
In ogni caso, finché rimaniamo nello spazio Unicode, non importa come le informazioni sulle stringhe siano archiviate all'interno di una singola applicazione. Se il formato di archiviazione interna consente di codificare correttamente tutte le oltre un milione di posizioni di codice e non vi è alcuna perdita di informazioni al limite dell'applicazione, ad esempio durante la lettura da un file o la copia negli appunti, allora tutto va bene.
Per interpretare correttamente il testo letto dal disco o da un socket di rete, è necessario prima determinarne la codifica. Questo viene fatto utilizzando meta-informazioni fornite dall'utente scritte all'interno o vicino al testo o determinate euristicamente.
Nella sostanza secca
Ci sono molte informazioni ed ha senso fare un breve riassunto di tutto ciò che è stato scritto sopra:
- Unicode postula una chiara distinzione tra i caratteri, la loro rappresentazione su un computer e la loro visualizzazione su un dispositivo di output.
- Lo spazio di codice Unicode è costituito da 1.114.112 punti di codice che vanno da 0 a 10FFFF.
- Il piano multilingue di base include i caratteri Unicode da U+0000 a U+FFFF, che sono codificati in UTF-16 come due byte.
- Qualsiasi codifica Unicode consente di codificare l'intero spazio delle posizioni del codice Unicode e la conversione tra varie codifiche di questo tipo viene eseguita senza perdita di informazioni.
- Le codifiche a byte singolo codificano solo una piccola parte dello spettro Unicode, ma possono essere utili quando si lavora con una grande quantità di informazioni monolingue.
- Le codifiche UTF-8 e UTF-16 hanno una lunghezza del codice variabile. In UTF-8, ogni carattere Unicode può essere codificato come uno, due, tre o quattro byte. In UTF-16, due o quattro byte.
- Il formato interno per la memorizzazione delle informazioni testuali all'interno di una particolare applicazione può essere arbitrario, a condizione che funzioni correttamente con l'intero spazio delle posizioni del codice Unicode e non vi siano perdite durante il trasferimento di dati transfrontaliero.
Una breve nota sulla codifica
Potrebbe esserci una certa confusione con il termine codifica. All'interno di Unicode, la codifica avviene due volte. La prima volta che viene codificato un set di caratteri Unicode (set di caratteri), nel senso che a ciascun carattere Unicode viene assegnata una posizione di codice corrispondente. Come parte di questo processo, il set di caratteri Unicode viene convertito in un set di caratteri codificato. La seconda volta che la sequenza di caratteri unicode viene convertita in una stringa di byte, questo processo viene anche chiamato codifica.
Nella terminologia inglese, ci sono due verbi diversi per codificare e codificare, ma anche i madrelingua spesso si confondono in essi. Inoltre, il termine set di caratteri o set di caratteri viene utilizzato come sinonimo del termine set di caratteri codificati.
Diciamo tutto questo al fatto che ha senso prestare attenzione al contesto e distinguere tra le situazioni quando si tratta della posizione del codice di un carattere Unicode astratto e quando si tratta della sua rappresentazione di byte.
Finalmente
Ci sono così tanti aspetti diversi di Unicode che è impossibile coprire tutto in un articolo. Sì, e non necessario. Le informazioni di cui sopra sono abbastanza per non confondersi nei principi di base e lavorare con il testo nella maggior parte delle attività quotidiane (leggi: senza andare oltre BMP). Nei seguenti articoli parleremo di normalizzazione, forniremo una panoramica storica più completa dello sviluppo delle codifiche, parleremo dei problemi della terminologia Unicode in lingua russa e faremo anche materiale sugli aspetti pratici dell'utilizzo di UTF-8 e UTF- 16.
Unicode: UTF-8, UTF-16, UTF-32.
Unicode è un insieme di caratteri grafici e un modo per codificarli per l'elaborazione computerizzata di dati di testo.
Unicode non solo assegna un codice univoco a ciascun carattere, ma definisce anche varie caratteristiche di quel carattere, ad esempio:
tipo di carattere (lettera maiuscola, lettera minuscola, numero, segno di punteggiatura, ecc.);
attributi dei caratteri (visualizzazione da sinistra a destra o da destra a sinistra, spazio, interruzione di riga, ecc.);
lettera maiuscola o minuscola corrispondente (rispettivamente per lettere minuscole e maiuscole);
il valore numerico corrispondente (per i caratteri numerici).
Standard UTF(abbreviazione di Unicode Transformation Format) per rappresentare i caratteri:
UTF-16: le domande frequenti su Installazione, accelerazione e Vista di Windows utilizzano la codifica UTF-16 per rappresentare tutti i caratteri Unicode. In UTF-16, i caratteri sono rappresentati da due byte (16 bit). Questa codifica viene utilizzata in Windows perché i valori a 16 bit possono rappresentare i caratteri che compongono gli alfabeti della maggior parte delle lingue del mondo, questo consente ai programmi di elaborare le stringhe più velocemente e di calcolarne la lunghezza. Tuttavia, 16 bit non sono sufficienti per rappresentare i caratteri alfabetici in alcune lingue. In questi casi, UTE-16 supporta codifiche "surrogate", consentendo la codifica dei caratteri a 32 bit (4 byte). Tuttavia, ci sono poche applicazioni che hanno a che fare con i caratteri di tali linguaggi, quindi UTF-16 è un buon compromesso tra risparmio di memoria e facilità di programmazione. Si noti che in .NET Framework, tutti i caratteri vengono codificati utilizzando UTF-16, quindi l'utilizzo di UTF-16 nelle applicazioni Windows migliora le prestazioni e riduce il consumo di memoria durante il passaggio di stringhe tra codice nativo e gestito.
UTF-8: Nella codifica UTF-8, diversi caratteri possono essere rappresentati da 1,2,3 o 4 byte. I caratteri con valori inferiori a 0x0080 vengono compressi a 1 byte, il che è molto conveniente per i caratteri statunitensi. I caratteri che corrispondono ai valori nell'intervallo 0x0080-0x07FF vengono convertiti in valori a 2 byte, che funzionano bene con alfabeti europei e mediorientali. I caratteri con valori più grandi vengono convertiti in valori a 3 byte, utili quando si lavora con le lingue dell'Asia centrale. Infine, le coppie "surrogate" vengono scritte in formato a 4 byte. UTF-8 è una codifica estremamente popolare. Tuttavia, è meno efficace di UTF-16 se vengono utilizzati frequentemente caratteri con valori di 0x0800 o superiori.
UTF-32: In UTF-32, tutti i caratteri sono rappresentati da 4 byte. Questa codifica è utile per scrivere semplici algoritmi per enumerare caratteri di qualsiasi lingua che non richiedono l'elaborazione di caratteri rappresentati da diversi numeri di byte. Ad esempio, quando si utilizza UTF-32, è possibile dimenticare i "surrogati", poiché qualsiasi carattere in questa codifica è rappresentato da 4 byte. Chiaramente, UTF-32 è tutt'altro che ideale in termini di utilizzo della memoria. Pertanto, questa codifica viene utilizzata raramente per trasferire stringhe sulla rete e salvarle in file. Di norma, UTF-32 viene utilizzato come formato interno per rappresentare i dati in un programma.
UTF-8
Nel prossimo futuro, verrà chiamato uno speciale formato Unicode (e ISO 10646). UTF-8. Questa codifica "derivata" utilizza stringhe di byte di varie lunghezze (da uno a sei) per scrivere caratteri, che vengono convertiti in codici Unicode utilizzando un semplice algoritmo, con stringhe più brevi corrispondenti a caratteri più comuni. Il vantaggio principale di questo formato è la compatibilità con ASCII non solo in termini di valori di codice, ma anche in termini di numero di bit per carattere, poiché un byte è sufficiente per codificare uno qualsiasi dei primi 128 caratteri in UTF-8 (sebbene, ad esempio, le lettere cirilliche necessitano di due byte).
Il formato UTF-8 è stato inventato il 2 settembre 1992 da Ken Thompson e Rob Pike e implementato nel Piano 9. Ora lo standard UTF-8 è ufficialmente sancito nei documenti RFC 3629 e ISO / IEC 10646 Allegato D.
Per il Web designer, questa codifica è di particolare importanza, poiché è dichiarata la "codifica di documenti standard" in HTML dalla versione 4.
Il testo composto solo da caratteri inferiori a 128 viene convertito in testo ASCII normale quando scritto in UTF-8. Al contrario, nel testo UTF-8, qualsiasi byte con un valore inferiore a 128 rappresenta un carattere ASCII con lo stesso codice. I restanti caratteri Unicode sono rappresentati come sequenze da 2 a 6 byte di lunghezza (in realtà solo fino a 4 byte, poiché non sono previsti codici maggiori di 221), in cui il primo byte è sempre 11xxxxxx e il resto è 10xxxxxx.
In poche parole, in UTF-8, i caratteri latini, la punteggiatura e i caratteri di controllo ASCII vengono scritti come codici US-ASCII e tutti gli altri caratteri vengono codificati utilizzando più ottetti con il bit più significativo di 1. Ciò ha due effetti.
Anche se il programma non riconosce Unicode, le lettere latine, i numeri arabi e i segni di punteggiatura verranno visualizzati correttamente.
Nel caso in cui le lettere latine e i segni di punteggiatura più semplici (incluso lo spazio) occupino una quantità significativa di testo, UTF-8 offre un aumento di volume rispetto a UTF-16.
A prima vista, può sembrare che UTF-16 sia più conveniente, poiché la maggior parte dei caratteri in esso contenuti sono codificati esattamente in due byte. Tuttavia, ciò è negato dalla necessità di supportare coppie di surrogati, che vengono spesso dimenticate quando si utilizza UTF-16, implementando solo il supporto per i caratteri UCS-2.
Lo standard è stato proposto nel 1991 dall'organizzazione no-profit Unicode Consortium (Unicode Inc.). L'uso di questo standard consente di codificare un numero molto elevato di caratteri di scritture diverse: nei documenti Unicode possono coesistere caratteri cinesi, simboli matematici, lettere dell'alfabeto greco, alfabeti latino e cirillico, mentre il cambio di tabella codici diventa superfluo.
Lo standard si compone di due sezioni principali: il set di caratteri universale (UCS, set di caratteri universali) e la famiglia di codifica (UTF, formato di trasformazione Unicode). Il set di caratteri universale specifica una corrispondenza uno-a-uno dei caratteri con i codici, elementi dello spazio del codice che rappresentano numeri interi non negativi. Una famiglia di codifica definisce la rappresentazione macchina di una sequenza di codici UCS.
Lo standard Unicode è stato sviluppato con l'obiettivo di creare un'unica codifica di caratteri per tutte le lingue scritte moderne e molte antiche. Ogni carattere in questo standard è codificato con 16 bit, il che gli consente di coprire un numero di caratteri incomparabilmente maggiore rispetto alle codifiche a 8 bit precedentemente accettate. Un'altra importante differenza tra Unicode e altri sistemi di codifica è che non solo assegna un codice univoco a ciascun carattere, ma definisce anche varie caratteristiche di quel carattere, ad esempio:
Tipo di carattere (lettera maiuscola, lettera minuscola, numero, segno di punteggiatura, ecc.);
Attributi dei caratteri (visualizzazione da sinistra a destra o da destra a sinistra, spazio, interruzione di riga, ecc.);
La lettera maiuscola o minuscola corrispondente (rispettivamente per lettere minuscole e maiuscole);
Il valore numerico corrispondente (per i caratteri numerici).
L'intera gamma di codici da 0 a FFFF è suddivisa in diversi sottoinsiemi standard, ognuno dei quali corrisponde o all'alfabeto di alcune lingue, oppure a un gruppo di caratteri speciali che sono simili nelle loro funzioni. Il diagramma seguente contiene un elenco generale di sottoinsiemi di Unicode 3.0 (Figura 2).
figura 2
Lo standard Unicode è la base per l'archiviazione e il testo in molti moderni sistemi informatici. Tuttavia, non è compatibile con la maggior parte dei protocolli Internet, poiché i suoi codici possono contenere qualsiasi valore di byte e i protocolli di solito utilizzano i byte 00 - 1F e FE - FF come byte di servizio. Per ottenere la compatibilità, sono stati sviluppati diversi formati di trasformazione Unicode (UTF, Unicode Transformation Formats), di cui UTF-8 è il più comune oggi. Questo formato definisce le seguenti regole per convertire ogni codice Unicode in un insieme di byte (da uno a tre) adatti al trasporto tramite protocolli Internet.
Qui x,y,z denotano i bit del codice sorgente, che devono essere estratti, partendo dal meno significativo, e inseriti nei byte del risultato da destra a sinistra, fino a riempire tutte le posizioni specificate.
L'ulteriore sviluppo dello standard Unicode è associato all'aggiunta di nuovi piani linguistici, ad es. caratteri negli intervalli 10000 - 1FFFF, 20000 - 2FFFF, ecc., dove dovrebbe includere la codifica per gli script di lingue morte che non sono incluse nella tabella sopra. È stato sviluppato un nuovo formato UTF-16 per codificare questi caratteri aggiuntivi.
Pertanto, ci sono 4 modi principali per codificare i byte in formato Unicode:
UTF-8: 128 caratteri codificati in un byte (formato ASCII), 1920 caratteri codificati in 2 byte ((caratteri romani, greci, cirillici, copti, armeni, ebraici, arabi), 63488 caratteri codificati in 3 byte (cinese, giapponese ecc. .) I restanti 2.147.418.112 caratteri (non ancora utilizzati) possono essere codificati con 4, 5 o 6 byte.
UCS-2: ogni carattere è rappresentato da 2 byte. Questa codifica include solo i primi 65.535 caratteri del formato Unicode.
UTF-16: questa è un'estensione di UCS-2 e include 1.114.112 caratteri Unicode. I primi 65.535 caratteri sono rappresentati da 2 byte, il resto da 4 byte.
USC-4: ogni carattere è codificato con 4 byte.