Come configurare smartphone e PC. Portale informativo
  • casa
  • Windows Phone
  • Quanti caratteri ci sono nella tabella unicode. Unicode sul Web: un'introduzione per principianti

Quanti caratteri ci sono nella tabella unicode. Unicode sul Web: un'introduzione per principianti

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
Per alcuni, queste informazioni possono sembrare ridondanti, ma sapresti quante domande ricevo in particolare riguardo ai krakozyabrs strisciati (un set di caratteri illeggibile). Ora avrò l'opportunità di riferire tutti al testo di questo articolo e cercare autonomamente i miei stipiti. Bene, preparati ad assorbire le informazioni e prova a seguire il corso della storia.

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:
Sono questi 128 caratteri della versione originale di ASCII che sono diventati lo standard e in qualsiasi altra codifica li incontrerai sicuramente e rimarranno in quell'ordine. Ma il fatto è che con l'aiuto di un byte di informazioni è possibile codificare non 128, ma ben 256 valori diversi (due alla potenza di otto fa 256), quindi dopo la versione base di Asuka, tutta una serie di codifiche ASCII estese, in cui, oltre ai 128 caratteri di base, era possibile codificare anche i simboli della codifica nazionale (ad esempio il russo). Qui, probabilmente, vale la pena dire qualcosa in più sui sistemi numerici utilizzati nella descrizione. In primo luogo, come tutti sapete, un computer funziona solo con i numeri nel sistema binario, cioè con zeri e uno ("algebra booleana", se qualcuno ha studiato in un istituto oa scuola). Un byte è composto da otto bit, ognuno dei quali è un due alla potenza di due, partendo da zero, e fino a due nel settimo:
Non è difficile capire che ci possono essere solo 256 di tutte le possibili combinazioni di zeri e uno in una tale costruzione.Convertire un numero da binario a decimale è abbastanza semplice. Devi solo sommare tutti i poteri di due, su cui ce ne sono uno. Nel nostro esempio, questo è 1 (2 alla potenza di zero) più 8 (due alla potenza di 3), più 32 (due alla quinta), più 64 (alla sesta), più 128 (alla settima) . Il totale ottiene 233 in notazione decimale. Come puoi vedere, tutto è molto semplice. Ma se dai un'occhiata più da vicino alla tabella con i caratteri ASCII, vedrai che sono rappresentati in codifica esadecimale. Ad esempio, "asterisco" corrisponde in Asci al numero esadecimale 2A. Probabilmente sai che oltre ai numeri arabi, il sistema numerico esadecimale utilizza anche lettere latine dalla A (che significa dieci) alla F (che significa quindici). Bene, per convertire binario in esadecimale ricorrere al seguente metodo semplice e visivo. Ogni byte di informazioni è diviso in due parti di quattro bit, come mostrato nella schermata sopra. Quella. in ogni mezzo byte solo sedici valori possono essere codificati in codice binario (da due alla quarta potenza), che può essere facilmente rappresentato come un numero esadecimale. Inoltre, nella metà sinistra del byte, sarà necessario contare nuovamente i gradi partendo da zero, e non come mostrato nello screenshot. Di conseguenza, con semplici calcoli, otteniamo che il numero E9 è codificato nello screenshot. Spero che il corso del mio ragionamento e la soluzione a questo enigma ti siano stati chiari. Bene, ora continuiamo, infatti, a parlare di codifiche di testo.

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ì):
Vedi, nella colonna di destra, i numeri iniziano con 8, perché i numeri da 0 a 7 si riferiscono alla parte base ASCII (vedi il primo screenshot). Quella. la lettera russa "M" in CP866 avrà il codice 9C (si trova all'intersezione della riga corrispondente con 9 e la colonna con il numero C nel sistema numerico esadecimale), che può essere scritto in un byte di informazioni, e se esiste un font adatto con caratteri russi, questa lettera verrà visualizzata senza problemi nel testo. Da dove viene questo importo? pseudografica in CP866? Il fatto è che questa codifica per il testo russo è stata sviluppata in quegli anni pelosi, quando non esisteva una tale distribuzione di sistemi operativi grafici come lo è ora. E in Dosa, e in sistemi operativi testuali simili, la pseudo-grafica ha permesso in qualche modo di diversificare la progettazione dei testi, e quindi abbonda in CP866 e in tutti gli altri suoi colleghi della categoria delle versioni estese di Asuka. CP866 è stato distribuito da IBM, ma oltre a questo, sono state sviluppate numerose codifiche per i caratteri russi, ad esempio è possibile attribuire lo stesso tipo (ASCII esteso) KOI8-R:
Il principio del suo funzionamento rimane lo stesso di quello del CP866 descritto poco prima: ogni carattere del testo è codificato da un singolo byte. Lo screenshot mostra la seconda metà della tabella KOI8-R, perché la prima metà corrisponde pienamente all'Asuka di base, che viene mostrato nel primo screenshot di questo articolo. Tra le caratteristiche della codifica KOI8-R, si può notare che le lettere russe nella sua tabella non sono in ordine alfabetico, come, ad esempio, è stato fatto in CP866. Se guardi il primo screenshot (della parte base, che è inclusa in tutte le codifiche estese), noterai che in KOI8-R le lettere russe si trovano nelle stesse celle della tabella delle lettere della consonante dell'alfabeto latino con loro dalla prima parte della tavola. Ciò è stato fatto per la comodità di passare dai caratteri russi a quelli latini scartando solo un bit (due alla settima potenza o 128).

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.):
A causa di una tale abbondanza di codifiche in lingua russa, i produttori di font e i produttori di software hanno costantemente mal di testa e noi, cari lettori, spesso siamo usciti dal famigerato krakozyabry quando c'era confusione con la versione utilizzata nel testo. Molto spesso uscivano quando inviavano e ricevevano messaggi via e-mail, il che portava alla creazione di tabelle di conversione molto complesse, che, in effetti, non potevano risolvere questo problema nella radice, e spesso gli utenti usavano la traslitterazione delle lettere latine per la corrispondenza per evitare il famigerato krakozyabry quando si utilizzano codifiche russe come CP866, KOI8-R o Windows 1251. In effetti, i bug che sono comparsi al posto del testo russo erano il risultato di un uso errato della codifica di questa lingua, che non corrispondeva al uno in cui il messaggio di testo era originariamente codificato. Ad esempio, se si tenta di visualizzare i caratteri codificati utilizzando il CP866 utilizzando la tabella dei codici di Windows 1251, verranno visualizzati gli stessi krakozyabry (set di caratteri senza significato), sostituendo completamente il testo del messaggio. Una situazione simile si verifica molto spesso durante la creazione e la configurazione di siti, forum o blog, quando il testo con caratteri russi viene erroneamente salvato nella codifica errata utilizzata sul sito per impostazione predefinita o nell'editor di testo sbagliato che aggiunge gag invisibili al codice occhio nudo. Alla fine, molte persone si sono stancate di una situazione del genere con molte codifiche e uscire costantemente da krakozyabry, c'erano i prerequisiti per creare una nuova variazione universale che avrebbe sostituito tutte quelle esistenti e avrebbe finalmente risolto il problema con la comparsa di testi illeggibili . Inoltre c'era il problema di lingue come il cinese, dove i caratteri della lingua erano molto più di 256.

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: Quanti caratteri possono essere codificati in UTF-16 utilizzando 16 bit? 65536 (due alla potenza di sedici), ed è stato questo numero che è stato adottato come spazio di base in Unicode. Inoltre, ci sono modi per codificare con esso circa due milioni di caratteri, ma limitati a uno spazio esteso di un milione di caratteri di testo. Ma anche questa riuscita versione della codifica Unicode non ha dato molta soddisfazione a chi scriveva, diciamo, programmi solo in inglese, perché dopo il passaggio dalla versione estesa di ASCII a UTF-16, il peso dei documenti è raddoppiato (un byte per un carattere in Asci e due byte per lo stesso carattere in UTF-16). Questo è tutto per la soddisfazione di tutti e di tutto nell'Unicode Consortium è stato deciso inventare una codifica lunghezza variabile. Si chiama UTF-8. Nonostante gli otto nel nome, ha davvero una lunghezza variabile, cioè ogni carattere di testo può essere codificato in una sequenza da uno a sei byte. In pratica, in UTF-8, viene utilizzato solo l'intervallo da uno a quattro byte, perché dietro quattro byte di codice, nulla è nemmeno teoricamente possibile immaginare. Tutti i caratteri latini in esso contenuti sono codificati in un byte, proprio come nel buon vecchio ASCII. Sorprendentemente, nel caso della codifica solo del latino, anche quei programmi che non capiscono Unicode leggeranno comunque ciò che è codificato in UTF-8. Quelli. la parte base di Asuka è semplicemente passata in questo frutto dell'Unicode Consortium. I caratteri cirillici in UTF-8 sono codificati in due byte e, ad esempio, i caratteri georgiani in tre byte. L'Unicode Consortium, dopo aver creato UTF 16 e 8, ha risolto il problema principale: ora ce l'abbiamo i caratteri hanno un unico spazio di codice. E ora i loro produttori possono riempirlo solo con forme vettoriali di caratteri di testo in base ai loro punti di forza e capacità. Nella "Tabella dei caratteri" sopra, puoi vedere che diversi tipi di carattere supportano un numero diverso di caratteri. Alcuni caratteri ricchi di Unicode possono essere molto grandi. Ma ora differiscono non per il fatto che sono stati creati per codifiche diverse, ma per il fatto che il produttore del font ha riempito o non ha riempito lo spazio di codice singolo con l'uno o l'altro modulo vettoriale fino alla fine.

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:
Nel caso di un sito su Joomla 1.5 e superiori, così come nel caso di un blog su WordPress, per evitare la comparsa di bug, scegli l'opzione UTF8 senza distinta base. Qual è il prefisso BOM? Il fatto è che quando hanno sviluppato la codifica UTF-16, per qualche motivo hanno deciso di associarvi qualcosa come la possibilità di scrivere un codice carattere, sia in sequenza diretta (ad esempio, 0A15) che al contrario (150A) . E affinché i programmi capissero in quale sequenza leggere i codici, è stato inventato BOM(Byte Order Mark o, in altre parole, firma), che è stato espresso nell'aggiunta di tre byte aggiuntivi proprio all'inizio dei documenti. Nella codifica UTF-8, nel consorzio Unicode non era prevista alcuna distinta base e quindi l'aggiunta di una firma (questi tre byte aggiuntivi più famosi all'inizio del documento) impedisce semplicemente ad alcuni programmi di leggere il codice. Pertanto, quando si salvano file in UTF, dobbiamo sempre scegliere l'opzione senza BOM (senza firma). Quindi avanzi proteggiti dal krakozyabry strisciante. Sorprendentemente, alcuni programmi in Windows non sanno come farlo (non possono salvare il testo in UTF-8 senza BOM), ad esempio lo stesso famigerato Blocco note di Windows. Salva il documento in UTF-8, ma aggiunge comunque la firma (tre byte extra) all'inizio di esso. Inoltre, questi byte saranno sempre gli stessi: leggi il codice in sequenza diretta. Ma sui server, a causa di questa piccola cosa, potrebbe sorgere un problema: uscirà krakozyabry. Pertanto, in nessun modo non utilizzare il normale blocco note di Windows per modificare i documenti del tuo sito, se non vuoi l'aspetto di krakozyabrov. Considero il già citato editor Notepad ++ l'opzione migliore e più semplice, che non ha praticamente inconvenienti e consiste solo in vantaggi. In Notepad++, quando selezioni una codifica, avrai la possibilità di convertire il testo nella codifica UCS-2, che è intrinsecamente molto vicina allo standard Unicode. Anche in Blocco note sarà possibile codificare il testo in ANSI, ad es. in relazione alla lingua russa, questo sarà Windows 1251, che abbiamo già descritto poco sopra.Da dove provengono queste informazioni? È scritto nel registro del tuo sistema operativo Windows - quale codifica scegliere nel caso di ANSI, quale scegliere nel caso di OEM (per la lingua russa sarà CP866). Se installi un'altra lingua predefinita sul tuo computer, queste codifiche verranno sostituite con altre simili della categoria ANSI o OEM per quella stessa lingua. Dopo aver salvato il documento in Notepad ++ nella codifica che ti serve o aperto il documento dal sito per la modifica, puoi vedere il suo nome nell'angolo in basso a destra dell'editor: Per evitare krakozyabrov, oltre alle azioni sopra descritte, sarà utile scrivere informazioni su questa codifica nella sua intestazione del codice sorgente di tutte le pagine del sito in modo che non ci sia confusione sul server o sull'host locale. In generale, in tutti i linguaggi di markup dell'ipertesto eccetto Html, viene utilizzata una speciale dichiarazione xml, che specifica la codifica del testo.< ? xml version= "1.0" encoding= "windows-1251" ? >Prima di analizzare il codice, il browser sa quale versione viene utilizzata e come devono essere interpretati esattamente i codici dei caratteri di quella lingua. Ma ciò che è degno di nota, se salvi il documento nell'unicode predefinito, allora questa dichiarazione xml può essere omessa (la codifica sarà considerata UTF-8 se non c'è BOM o UTF-16 se c'è una BOM). Nel caso di un documento in lingua Html, la codifica viene utilizzata per specificare Meta elemento, che è scritto tra il tag Head di apertura e chiusura: < head> . . . < meta charset= "utf-8" > . . . < / head>Questa voce è abbastanza diversa dallo standard in Html 4.01, ma è pienamente coerente con il nuovo standard Html 5 che viene introdotto lentamente e sarà compreso correttamente al 100% da tutti i browser attualmente in uso. In teoria, sarebbe meglio inserire l'elemento Meta con la codifica Html del documento il più in alto possibile nell'intestazione del documento in modo che al momento dell'incontro nel testo del primo carattere non dall'ANSI di base (che verrà sempre letto correttamente e in ogni sua variazione), il browser dovrebbe già avere informazioni su come interpretare i codici di questi caratteri. Collegati al primo

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:

  1. 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 ( ╔ ╗).
  2. I caratteri erano legati a una codifica specifica.
  3. 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.
  4. 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.
  5. 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.

Articoli correlati in alto