Computer finestre Internet

Codifica dei caratteri - PIE.Wiki. Codifica delle informazioni di testo

Unicode è un sistema di codifica dei caratteri utilizzato dai computer per archiviare e scambiare dati testuali. Unicode ha un numero univoco (o punto di codice) per ogni carattere nei principali sistemi di scrittura del mondo. Questo sistema include anche simboli tecnici, segni di punteggiatura e molti altri simboli utilizzati nella scrittura.

Oltre ad essere una mappa dei caratteri, Unicode include anche algoritmi per la corrispondenza e la codifica di script a due lati come l'arabo, nonché specifiche per la normalizzazione delle forme testuali.

Questa sezione fornisce una descrizione generale di Unicode. Per più informazioni complete e per un elenco delle lingue supportate i cui caratteri possono essere codificati utilizzando Unicode, vedere il sito Web Unicode Consortium.

Punti codice

I simboli sono unità di informazione che corrispondono approssimativamente a un'unità di testo nella scrittura in linguaggio naturale. Unicode definisce il modo in cui i caratteri vengono interpretati anziché visualizzati.

Un'immagine di carattere (glifo) che viene visualizzata, o una rappresentazione visiva di un carattere, è un carattere che appare sullo schermo di un monitor o su una pagina stampata. In alcuni sistemi di scrittura, un carattere può corrispondere a più glifi o più caratteri possono corrispondere a un singolo glifo. Ad esempio, "ll" in spagnolo è un glifo, ma due caratteri: "l" e "l".

In Unicode, i caratteri vengono convertiti in punti di codice. I punti codice sono numeri assegnati dal Consorzio Unicode a ciascun carattere in ciascun sistema di notazione. I punti di codice sono rappresentati come "U +" e quattro numeri e/o lettere. Di seguito sono riportati esempi di punti di codice per quattro caratteri diversi: l minuscola, u minuscola con dieresi, beta ed e minuscola con acuto.

Unicode contiene 1.114.112 punti di codice; ad oggi, hanno oltre 96.000 caratteri assegnati.

Livelli (piani)

Lo spazio del codice Unicode per i caratteri è diviso in 17 piani, ognuno dei quali contiene 65.536 punti di codice.

Il primo livello (piano) -piano 0- è il Basic Multilingual Plane (BMP). La maggior parte dei caratteri più utilizzati viene codificata utilizzando BMP e questo è il livello in cui viene codificata la maggior parte dei caratteri oggi. BMP contiene punti di codice per quasi tutti i caratteri nelle lingue moderne e molti personaggi speciali... Ci sono circa 6.300 punti di codice inutilizzati in BMP, che verranno utilizzati per aggiungere più caratteri in futuro.

Il livello successivo (piano) -piano 1- è il Piano multilingue supplementare (SMP). SMP è usato per codificare caratteri antichi così come musicali e simboli matematici.

Codifica dei caratteri

La codifica dei caratteri definisce ogni carattere, il suo punto di codice e come il punto di codice è rappresentato in bit. Senza sapere quale codifica è stata utilizzata, non sarai in grado di interpretare correttamente la stringa di caratteri.

Esistono un numero molto elevato di schemi di codifica, ma è molto difficile convertire i loro dati tra di essi e pochi di essi possono tenere conto della presenza di caratteri in più di due o tre lingue diverse. Ad esempio, se il tuo PC è impostato per utilizzare OEM-Latin II per impostazione predefinita e stai navigando in un sito Web che utilizza IBM EBCDIC-Cyrillic, tutti i caratteri che saranno rappresentati in cirillico che non saranno codificati nello schema Latin II non saranno Questi caratteri verranno sostituiti da altri caratteri, come punti interrogativi e quadrati.

Poiché Unicode contiene punti di codice per la maggior parte dei caratteri in tutto lingue moderne, quindi l'utilizzo della codifica dei caratteri Unicode consentirà al computer di interpretare quasi tutti i caratteri conosciuti.

Esistono tre principali schemi Unicode per la codifica dei caratteri: UTF-8, UTF-16 e UTF-32. UTF sta per Unicode Transformation Format. I numeri che seguono UTF indicano la dimensione delle unità (in byte) utilizzate per la codifica.

  • UTF-8 utilizza un'unità di codice a larghezza variabile a 8 bit. UTF-8 utilizza da 1 a 6 byte per codificare un carattere; può utilizzare meno, lo stesso o più byte di UTF-16 per codificare lo stesso carattere. In Windows-1251, ogni codice da 0 a 127 (da U + 0000 a U + 0127) è memorizzato in un byte. Solo i punti di codice 128 (U + 0128) e superiori vengono memorizzati utilizzando da 2 a 6 byte.
  • UTF-16 utilizza un'unità di codice a 16 bit a larghezza fissa. È relativamente compatto e tutti i caratteri più comunemente usati possono essere codificati con una singola unità di codice a 16 bit. È possibile accedere ad altri caratteri utilizzando coppie di unità di codice a 16 bit.
  • UTF-32 ci vogliono 4 byte per codificare qualsiasi carattere. Nella maggior parte dei casi, un documento con codifica UTF-32 sarà circa il doppio delle dimensioni di un documento con codifica UTF-16. Ogni carattere è codificato in un'unità di codifica a larghezza fissa a 32 bit. È possibile utilizzare UTF-32 se non si dispone di spazio su disco limitato e si desidera utilizzare un'unità di codice per ogni carattere.

Tutte e tre le forme di codifica possono codificare gli stessi caratteri e possono essere tradotte dall'una all'altra senza perdita di dati.

Esistono anche altre codifiche: ad esempio UTF-7 e UTF-EBCDIC. C'è anche GB18030, che è l'equivalente cinese di UTF-8 e supporta i caratteri cinesi semplificati e tradizionali. Per la lingua russa, è conveniente usare Windows-1251.

Copyright © 1995-2014 Esri. Tutti i diritti riservati.

Unicode è un mondo molto grande e complesso, perché lo standard ti permette di rappresentare e lavorare in un computer con tutti i principali script del mondo. Alcuni sistemi di scrittura esistono da oltre mille anni e molti di essi si sono evoluti quasi indipendentemente l'uno dall'altro in diverse parti del mondo. Le persone hanno inventato così tante cose e spesso sono così diverse l'una dall'altra che è stato un compito estremamente difficile e ambizioso combinare tutto questo in un unico standard.

Per capire davvero Unicode, devi immaginare almeno 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 conoscere un minimo ragionevole di informazioni 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é avevi bisogno di 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 era piuttosto arbitraria. Se hai lavorato con l'una o l'altra lingua nazionale, sul tuo sistema sono state installate le corrispondenti codifiche dei caratteri, che hanno permesso di disegnare byte dal disco sullo schermo in modo tale da avere un senso per l'utente.

Se hai stampato un file di testo su una stampante e hai visto una serie di krakozyabras incomprensibili su una pagina di carta, significa che i caratteri corrispondenti non sono stati caricati nel dispositivo di stampa e interpreta i byte in un modo diverso da come vorresti.

Questo approccio in generale e le codifiche a byte singolo in particolare presentavano una serie di inconvenienti significativi:

  1. Era possibile lavorare contemporaneamente con solo 256 caratteri, e i primi 128 erano riservati a caratteri latini e di controllo, e nella seconda metà, oltre ai caratteri dell'alfabeto nazionale, era necessario trovare un posto per pseudo-grafici caratteri (╔ ╗).
  2. I caratteri erano legati a una codifica specifica.
  3. Ogni codifica rappresentava il proprio insieme di caratteri e la conversione da uno all'altro era possibile solo con perdite parziali, quando i caratteri mancanti venivano sostituiti da altri graficamente simili.
  4. Il trasferimento di file tra dispositivi con sistemi operativi diversi era difficile. Era necessario disporre di un programma di conversione o di portare caratteri aggiuntivi insieme al file. L'esistenza di Internet come la conosciamo era impossibile.
  5. Esistono nel mondo sistemi di scrittura non alfabetici (scrittura geroglifica), che in una codifica a byte singolo non sono rappresentabili in linea di principio.

Principi di base 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, e poi passare dall'astratto al concreto.

Importante! Uno dei principi centrali della filosofia Unicode è una chiara distinzione tra i caratteri, la loro rappresentazione in un computer e la loro visualizzazione su un dispositivo di output.

Viene introdotto il concetto di carattere unicode astratto, che esiste esclusivamente sotto forma di concetto speculativo e di accordo tra persone, sancito dallo standard. Ogni carattere Unicode è associato a un numero intero non negativo chiamato punto di codice.

Quindi, ad esempio, il carattere unicode U + 041F è una lettera cirillica maiuscola P. Esistono diversi modi per rappresentare questo carattere nella memoria del computer, proprio come ci sono diverse migliaia di modi per visualizzarlo sullo schermo del monitor. Ma allo stesso tempo P, sarà anche P o U + 041F in Africa.

Questo è il familiare incapsulamento, o separazione dell'interfaccia dall'implementazione, un concetto che ha funzionato bene nella programmazione.

Si scopre che, essendo 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
annotalo su un pezzo di carta, impacchettalo in una busta e spediscilo in qualsiasi parte del mondo. Se conoscono l'esistenza di Unicode, il testo verrà percepito da loro esattamente allo stesso modo di me e te. Non avranno il minimo dubbio che il penultimo carattere sia proprio il cirillico minuscolo e(U + 0435) non dire latino minuscolo e(U + 0065). Nota che non abbiamo detto una parola sulla rappresentazione in byte.

Sebbene i caratteri Unicode siano chiamati simboli, non sempre corrispondono a un carattere nel senso tradizionale ingenuo, come una lettera, un numero, un segno di punteggiatura o un geroglifico. (Vedi sotto lo spoiler per maggiori dettagli.)

Esempi di vari caratteri Unicode

Ci sono caratteri Unicode puramente tecnici, ad esempio:

  • U + 0000: carattere nullo;
  • U + D800 – U + DFFF: surrogati minori e maggiori per la rappresentazione tecnica dei punti di codice nell'intervallo da 10000 a 10FFFF (leggi: al di fuori di BMP / BMP) nella famiglia di codifica UTF-16;
  • eccetera.
Ci sono segni di punteggiatura, come U + 200F: un marker per cambiare la direzione della scrittura da destra a sinistra.

C'è un'intera coorte di spazi di varie larghezze e scopi (vedi l'eccellente articolo habr :):

  • U + 0020 (spazio);
  • U + 00A0 (spazio unificatore, in HTML);
  • U + 2002 (spazio semicircolare o En Space);
  • U + 2003 (spazio rotondo o spazio Em);
  • eccetera.
Ci sono segni diacritici combinati - tutti i tipi di tratti, punti, tilde, ecc., Che cambiano / chiariscono il significato del segno precedente e il suo contorno. Ad esempio:
  • U + 0300 e U + 0301: segni di stress primario (acuto) e secondario (debole);
  • U + 0306: breve (apice), come in th;
  • U + 0303: apice tilde
  • eccetera.
Esistono persino tag linguistici esotici (U + E0001, U + E0020 – U + E007E e U + E007F), che ora sono nel limbo. Sono stati concepiti come la capacità di contrassegnare determinate sezioni di testo come appartenenti a una particolare variante linguistica (ad esempio, inglese americano e britannico), che potrebbe influenzare i dettagli di come viene visualizzato il testo.

Che cos'è un simbolo, qual è la differenza tra un grappolo di grafemi (leggi: percepito come una singola immagine intera di un simbolo) da un simbolo unicode e da un codice quantistico, te lo diremo la prossima volta.

Spazio codice Unicode

Lo spazio del 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 per la nona versione dello standard.Una parte dello spazio è riservata all'uso privato e il consorzio Unicode promette di non assegnare mai valori alle posizioni di 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 devi affrontare solo il Basic Multilingual Plane (BMP), che include caratteri Unicode da U + 0000 a U + FFFF. (Guardando un po' avanti: i caratteri BMP sono rappresentati in UTF-16 in due byte, non in quattro). Nel 2016, questa tesi è già in dubbio. Quindi, ad esempio, i caratteri Emoji popolari potrebbero essere trovati in un messaggio utente e devi essere in grado di elaborarli correttamente.

Codifiche

Se vogliamo inviare del testo su Internet, dobbiamo codificare una sequenza di caratteri unicode come una sequenza di byte.

Lo standard Unicode include una serie di codifiche Unicode, come UTF-8 e UTF-16BE / UTF-16LE, che consentono di codificare l'intero spazio del punto di codice. La conversione tra queste codifiche può essere eseguita liberamente senza perdita di informazioni.

Inoltre, nessuno ha cancellato le codifiche a byte singolo, ma ti consentono di codificare il tuo pezzo individuale e molto stretto dello spettro Unicode - 256 o meno punti di codice. Per tali codifiche esistono e sono a disposizione di tutti delle tabelle, dove ad ogni valore di un singolo byte è associato 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 di testo.

UTF-8 è la codifica Unicode più utilizzata su Internet (ha vinto la palma nel 2008), principalmente grazie alla sua economia e alla compatibilità trasparente con ASCII a sette bit. Caratteri 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 in un byte, come in ASCII. I caratteri di molte scritture principali, a parte alcuni dei caratteri geroglifici più rari, sono rappresentati in essa da due o tre byte. Il punto di codice più grande definito dallo standard, 10FFFF, è codificato in quattro byte.

Nota 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 quanto. Il numero 8 indica la lunghezza in bit dell'unità di codice - 8 bit. Per la famiglia di codifiche 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, allora UTF-8 può dare un vantaggio molto tangibile, perché tutti i markup e i blocchi JavaScript e CSS verranno codificati in modo efficiente in un byte. Per esempio home page Habra in UTF-8 è 139Kb e in UTF-16 è già 256Kb. Per fare un confronto, se usi win-1251 con la perdita della capacità di memorizzare alcuni caratteri, la dimensione, rispetto a UTF-8, verrà ridotta di soli 11Kb a 128Kb.

Per memorizzare le informazioni sulle stringhe nelle applicazioni, le codifiche Unicode a 16 bit vengono spesso utilizzate per la loro semplicità e per il fatto che i caratteri dei principali sistemi di scrittura del mondo sono codificati in un quantum a sedici bit. Quindi, ad esempio, Java utilizza con successo UTF-16 per la rappresentazione interna delle stringhe. Anche il sistema operativo Windows utilizza internamente UTF-16.

In ogni caso, finché rimaniamo nello spazio Unicode, non importa in che modo le informazioni sulle stringhe vengono archiviate all'interno di una singola applicazione. Se il formato di archiviazione interno consente di codificare correttamente tutti gli oltre un milione di punti di codice e non vi è alcuna perdita di informazioni al confine dell'applicazione, ad esempio durante la lettura da un file o la copia negli appunti, allora tutto va bene.

Per una corretta interpretazione del 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 dentro o vicino al testo, oppure è determinato euristicamente.

Nel residuo secco

Le informazioni sono molte e ha senso fare un breve riassunto di tutto ciò che è stato scritto sopra:
  • Unicode postula una chiara distinzione tra i caratteri, la loro rappresentazione in un computer e la loro visualizzazione su un dispositivo di output.
  • I caratteri Unicode non sempre corrispondono a un carattere nel senso tradizionale ingenuo, come una lettera, un numero, un segno di punteggiatura o un geroglifico.
  • Lo spazio del 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 in due byte.
  • Qualsiasi codifica Unicode consente di codificare l'intero spazio dei punti di codice Unicode e la conversione tra diverse codifiche di questo tipo viene eseguita senza perdita di informazioni.
  • Le codifiche a byte singolo possono codificare solo una piccola parte dello spettro unicode, ma possono essere utili quando si lavora con una grande quantità di informazioni monolingui.
  • Le codifiche UTF-8 e UTF-16 hanno lunghezze di codice variabili. In UTF-8, ogni carattere Unicode può essere codificato con uno, due, tre o quattro byte. In UTF-16, due o quattro byte.
  • Il formato interno di memorizzazione delle informazioni testuali all'interno di un'applicazione separata può essere arbitrario, a condizione che funzioni correttamente con l'intero spazio dei punti di codice Unicode e che non vi siano perdite nella trasmissione di dati transfrontalieri.

Una breve nota sulla codifica

Si può fare un po' di confusione con il termine codifica. All'interno di Unicode, la codifica avviene due volte. La prima volta che viene codificato un set di caratteri, nel senso che a ciascun carattere Unicode viene assegnato un punto di codice corrispondente. Questo processo converte il set di caratteri Unicode in un set di caratteri codificati. La seconda volta che una 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 da codificare e da codificare, ma anche i madrelingua sono spesso confusi su di essi. Inoltre, il termine set di caratteri o set di caratteri viene utilizzato come sinonimo del termine set di caratteri codificati.

Tutto questo diciamo al fatto che ha senso prestare attenzione al contesto e distinguere le situazioni quando si tratta della posizione del codice di un carattere unicode astratto e quando si tratta della sua rappresentazione in byte.

Infine

Ci sono così tanti aspetti diversi di Unicode che è impossibile coprire tutto in un articolo. E inutile. Le informazioni di cui sopra sono sufficienti per evitare confusione nei principi di base e lavorare con il testo nella maggior parte delle attività quotidiane (leggi: senza andare oltre BMP). Nei prossimi articoli parleremo della normalizzazione, forniremo una panoramica storica più completa dello sviluppo delle codifiche, parleremo dei problemi della terminologia Unicode in lingua russa e forniremo anche materiale sugli aspetti pratici dell'utilizzo di UTF-8 e UTF-16 .

Unicode

Logo del Consorzio Unicode

Unicode(il più delle volte) o Unicode(ing. Unicode) è uno standard di codifica dei caratteri che consente di rappresentare i caratteri in quasi tutte le lingue scritte.

Lo standard è stato proposto nel 1991 dall'organizzazione no profit "Unicode Consortium" (ing. Consorzio Unicode, Unicode Inc.).

L'uso di questo standard consente di codificare un numero molto elevato di caratteri provenienti da diversi script: nei documenti Unicode possono coesistere caratteri cinesi, caratteri matematici, lettere dell'alfabeto greco, latino e cirillico, quindi non è necessario cambiare codepage.

Lo standard è composto da due sezioni principali: set di caratteri universale (ing. UCS, set di caratteri universale) e la famiglia delle codifiche (ing. UTF, formato di trasformazione Unicode).

Il set di caratteri universale definisce una corrispondenza uno a uno dei caratteri con i codici - elementi dello spazio del codice che rappresentano numeri interi non negativi. La famiglia delle codifiche definisce la rappresentazione macchina di una sequenza di codici UCS.

I codici Unicode sono suddivisi in diverse aree. L'area con i codici da U + 0000 a U + 007F contiene i caratteri ASCII con i codici corrispondenti. Seguono le aree dei segni di varie scritture, segni di punteggiatura e simboli tecnici.

Alcuni dei codici sono riservati per un uso futuro. Sotto i caratteri cirillici vengono allocate aree di caratteri con codici da U + 0400 a U + 052F, da U + 2DE0 a U + 2DFF, da U + A640 a U + A69F (vedi Cirillico in Unicode).

  • 1 Prerequisiti per la creazione e lo sviluppo di Unicode
  • 2 versioni Unicode
  • 3 Spazio codice
  • 4 Sistema di codifica
    • 4.1 Politica del Consorzio
    • 4.2 Combinazione e duplicazione di simboli
  • 5 Modificare i caratteri
  • 6 Algoritmi di normalizzazione
    • 6.1 DNF
    • 6.2 NFC
    • 6.3 NFKD
    • 6.4 NFKC
    • 6.5 Esempi
  • 7 Scrittura bidirezionale
  • 8 simboli in primo piano
  • 9 ISO/IEC 10646
  • 10 modi di presentazione
    • 10.1 UTF-8
    • 10.2 Ordine dei byte
    • 10.3 Unicode e codifiche tradizionali
    • 10.4 Implementazioni
  • 11 metodi di input
  • 12 problemi di Unicode
  • 13 "Unicode" o "Unicode"?

Prerequisiti per la creazione e lo sviluppo di Unicode

Alla fine degli anni '80, i caratteri a 8 bit erano diventati lo standard. Allo stesso tempo, c'erano molte diverse codifiche a 8 bit e ne apparivano costantemente di nuove.

Ciò è stato spiegato sia dalla costante espansione della gamma di lingue supportate, sia dal desiderio di creare una codifica parzialmente compatibile con un'altra (un tipico esempio è l'emergere di una codifica alternativa per la lingua russa, dovuta allo sfruttamento delle lingue occidentali programmi creati per la codifica CP437).

Di conseguenza, sono comparsi diversi problemi:

  1. il problema di "krakozyabr";
  2. il problema del set di caratteri limitato;
  3. il problema di convertire una codifica in un'altra;
  4. il problema dei caratteri duplicati.

Il problema "krakozyabr"- il problema della visualizzazione dei documenti nella codifica errata. Il problema potrebbe essere risolto sia introducendo coerentemente metodi per specificare la codifica utilizzata, sia introducendo un'unica codifica (comune) per tutti.

Il problema del set di caratteri limitato... Il problema potrebbe essere risolto cambiando i caratteri all'interno del documento o introducendo una codifica "ampia". La commutazione dei caratteri è stata a lungo praticata negli elaboratori di testi e sono stati spesso utilizzati caratteri con una codifica non standard, i cosiddetti. "Caratteri Dingbat". Di conseguenza, quando si tenta di trasferire un documento su un altro sistema, tutti i caratteri non standard si trasformano in "krakozyabry".

Il problema di convertire una codifica in un'altra... Il problema potrebbe essere risolto sia compilando tabelle di conversione per ogni coppia di codifiche, sia utilizzando una conversione intermedia in una terza codifica che includa tutti i caratteri di tutte le codifiche.

Problema con caratteri duplicati... Per ogni codifica è stato creato un proprio font, anche se i set di caratteri nelle codifiche coincidevano parzialmente o completamente. Il problema potrebbe essere risolto creando dei font "grandi", dai quali sarebbero successivamente selezionati i caratteri necessari per una data codifica. Tuttavia, ciò ha richiesto la creazione di un unico registro di simboli per determinare cosa corrisponde a cosa.

È stata riconosciuta la necessità di un'unica codifica "ampia". Le codifiche a lunghezza variabile, ampiamente utilizzate nell'Asia orientale, sono risultate troppo difficili da utilizzare, quindi si è deciso di utilizzare caratteri a larghezza fissa.

L'utilizzo di caratteri a 32 bit sembrava troppo dispendioso, quindi è stato deciso di utilizzare caratteri a 16 bit.

La prima versione di Unicode era una codifica con una dimensione di carattere fissa di 16 bit, ovvero il numero totale di codici era 2 16 (65 536). Da allora, i simboli sono stati denotati da quattro cifre esadecimali (ad esempio, U + 04F0). Allo stesso tempo, è stato pianificato di codificare in Unicode non tutti i caratteri esistenti, ma solo quelli necessari nella vita di tutti i giorni. I simboli usati raramente dovevano essere collocati nella "zona di uso privato" che originariamente occupava i codici U + D800 ... U + F8FF.

Per poter utilizzare Unicode anche come intermediario nella conversione di codifiche diverse tra loro, sono stati inclusi tutti i caratteri rappresentati in tutte le codifiche più famose.

In futuro, tuttavia, si è deciso di codificare tutti i simboli e, in relazione a ciò, espandere notevolmente il dominio del codice.

Allo stesso tempo, i codici carattere iniziarono a essere considerati non come valori a 16 bit, ma come numeri astratti che possono essere rappresentati in un computer in molti modi diversi (vedi metodi di rappresentazione).

Poiché in alcuni sistemi informatici (ad esempio Windows NT) i caratteri fissi a 16 bit erano già utilizzati come codifica predefinita, si è deciso di codificare tutti i caratteri più importanti solo all'interno delle prime 65.536 posizioni (il cosiddetto English. aereo multilingue di base, BMP).

Il resto dello spazio è utilizzato per "caratteri aggiuntivi" (ing. caratteri supplementari): sistemi di scrittura di lingue estinte o caratteri cinesi usati molto raramente, simboli matematici e musicali.

Per compatibilità con i vecchi sistemi a 16 bit, è stato inventato il sistema UTF-16, in cui le prime 65.536 posizioni, ad eccezione delle posizioni dall'intervallo U + D800 ... U + DFFF, vengono visualizzate direttamente come numeri a 16 bit, e il resto sono rappresentati come "coppie sostitutive" (Il primo elemento della coppia dalla regione U + D800… U + DBFF, il secondo elemento della coppia dalla regione U + DC00… U + DFFF). Per le coppie surrogate è stata utilizzata una parte del code space (2048 posizioni) destinata ad “uso privato”.

Poiché UTF-16 può visualizzare solo 2 20 +2 16 -2048 (1 112 064) caratteri, questo numero è stato scelto come valore finale dello spazio del codice Unicode (intervallo di codici: 0x000000-0x10FFFF).

Sebbene l'area del codice Unicode sia stata estesa oltre 2-16 già nella versione 2.0, i primi caratteri nell'area "in alto" sono stati inseriti solo nella versione 3.1.

Il ruolo di questa codifica nel settore web è in costante crescita. All'inizio del 2010, la quota di siti Web che utilizzano Unicode era di circa il 50%.

Versioni Unicode

Il lavoro per finalizzare lo standard continua. Nuove versioni vengono rilasciate man mano che le tabelle dei simboli cambiano e vengono aggiornate. Parallelamente vengono emessi nuovi documenti ISO/IEC 10646.

Il primo standard è stato rilasciato nel 1991, l'ultimo nel 2016, il prossimo è previsto nell'estate del 2017. Le versioni degli standard 1.0-5.0 sono state pubblicate come libri e hanno un ISBN.

Il numero di versione dello standard è composto da tre cifre (ad esempio, "4.0.1"). La terza cifra viene modificata quando vengono apportate modifiche minori allo standard che non aggiungono nuovi caratteri.

Spazio codice

Sebbene i moduli di notazione UTF-8 e UTF-32 consentano di codificare fino a 2.331 (2.147.483.648) punti di codice, è stato deciso di utilizzare solo 1.112.064 per la compatibilità con UTF-16. Tuttavia, anche questo è più che sufficiente per il momento: nella versione 6.0 vengono utilizzati poco meno di 110.000 punti di codice (109.242 grafici e 273 altri simboli).

Lo spazio del codice è suddiviso in 17 aerei(ing. aerei) 2 16 (65 536) caratteri ciascuno. Piano terra ( piano 0) è chiamato di base (di base) e contiene i simboli degli script più comuni. Il resto degli aerei sono aggiuntivi ( supplementare). Il primo aereo ( piano 1) è utilizzato principalmente per le scritture storiche, il secondo ( piano 2) - per i caratteri cinesi usati raramente (CJK), il terzo ( piano 3) è riservato ai caratteri cinesi arcaici. Gli aerei 15 e 16 sono riservati ad uso privato.

Per indicare i caratteri Unicode, usa la notazione come "U + xxxx"(Per i codici 0 ... FFFF), o" U + xxxxx"(Per i codici 10000 ... FFFFF), oppure" U + xxxxxx"(Per i codici 100000 ... 10FFFF), dove xxx- cifre esadecimali. Ad esempio, il carattere "i" (U + 044F) ha il codice 044F 16 = 1103 10.

Sistema di codifica

Il sistema di codifica universale (Unicode) è un insieme di simboli grafici e un modo per codificarli per l'elaborazione al computer di dati di testo.

I simboli grafici sono simboli che hanno un'immagine visibile. I caratteri grafici si oppongono ai caratteri di controllo e formattazione.

I simboli grafici includono i seguenti gruppi:

  • lettere contenute in almeno uno degli alfabeti supportati;
  • numeri;
  • segni di punteggiatura;
  • segni speciali (matematici, tecnici, ideogrammi, ecc.);
  • separatori.

Unicode è un sistema per la rappresentazione lineare del testo. I caratteri con apici o pedici aggiuntivi possono essere rappresentati come una sequenza di codici costruiti secondo determinate regole (carattere composto) o come un singolo carattere (versione monolitica, carattere precomposto). Sul questo momento(2014), si ritiene che tutte le lettere di caratteri di grandi dimensioni siano incluse in Unicode e se un simbolo è disponibile in una versione composita, non è necessario duplicarlo in una forma monolitica.

Politica consortile

Il consorzio non ne crea uno nuovo, ma stabilisce l'ordine delle cose stabilito. Ad esempio, le immagini emoji sono state aggiunte perché gli operatori mobili giapponesi le utilizzavano ampiamente.

Per fare ciò, l'aggiunta di un simbolo passa attraverso un processo complesso. E, ad esempio, il simbolo del rublo russo lo ha superato in tre mesi semplicemente perché ha ricevuto lo status ufficiale.

I marchi sono codificati solo in via eccezionale. Quindi, in Unicode non c'è il flag di Windows o la mela di Apple.

Una volta che un carattere è apparso nella codifica, non si sposterà né scomparirà mai. Se è necessario modificare l'ordine dei caratteri, ciò viene fatto non modificando le posizioni, ma mediante l'ordinamento nazionale. Esistono altre garanzie di stabilità più sottili: ad esempio, le tabelle di normalizzazione non cambieranno.

Combinazione e duplicazione di simboli

Lo stesso simbolo può assumere diverse forme; in Unicode, queste forme sono contenute in un punto di codice:

  • se è accaduto storicamente. Ad esempio, le lettere arabe hanno quattro forme: staccate, all'inizio, al centro e alla fine;
  • o se una lingua viene adottata in una forma e in un'altra - un'altra. Il cirillico bulgaro differisce dal russo e i caratteri cinesi dal giapponese.

D'altra parte, se storicamente c'erano due punti di codice diversi nei caratteri, rimangono diversi in Unicode. Il sigma greco minuscolo ha due forme e hanno posizioni diverse. Lettera latina estesa Å (A con un cerchio) e segno angstrom Å, lettera grecaμ e il prefisso “micro” µ sono simboli diversi.

Naturalmente, caratteri simili in script non correlati vengono inseriti in punti di codice diversi. Ad esempio, la lettera A in latino, cirillico, greco e cherokee sono simboli diversi.

È estremamente raro che lo stesso carattere venga inserito in due posizioni di codice diverse per semplificare l'elaborazione del testo. Il tratto matematico e lo stesso tratto per indicare la morbidezza dei suoni sono simboli diversi, il secondo è considerato una lettera.

Modificare i caratteri

Rappresentazione del carattere "Y" (U + 0419) nella forma del carattere base "I" (U + 0418) e del carattere modificante "" (U + 0306)

I caratteri grafici in Unicode sono divisi in estesi e non estesi (senza larghezza). I caratteri non estesi non occupano spazio nella riga quando vengono visualizzati. Questi includono, in particolare, gli accenti e altri segni diacritici. Sia i caratteri estesi che quelli non estesi hanno i propri codici. I simboli estesi sono altrimenti chiamati di base (ing. personaggi di base), e quelli non estesi - modificativi (ing. combinazione di caratteri); e quest'ultimo non può incontrarsi in modo indipendente. Ad esempio, il carattere “á” può essere rappresentato come una sequenza del carattere base “a” (U + 0061) e il carattere modificatore “́” (U + 0301), oppure come carattere monolitico “á” (U + 00E1).

Un tipo speciale di caratteri modificabili sono i selettori di stile del viso (ing. selettori di variazione). Si applicano solo a quei simboli per i quali sono definite tali varianti. Nella versione 5.0, i pesi sono definiti per un numero di simboli matematici, per i simboli dell'alfabeto tradizionale mongolo e per i simboli della scrittura quadrata mongola.

Algoritmi di normalizzazione

Poiché gli stessi simboli possono essere rappresentati codici diversi, il confronto delle stringhe byte per byte diventa impossibile. Algoritmi di normalizzazione forme di normalizzazione) risolvono questo problema convertendo il testo in un determinato modulo standard.

Il casting viene effettuato sostituendo i simboli con altri equivalenti utilizzando tabelle e regole. "Decomposizione" è la sostituzione (scomposizione) di un carattere in più caratteri costituenti e "composizione", al contrario, è la sostituzione (connessione) di più caratteri costituenti con un carattere.

Lo standard Unicode definisce 4 algoritmi di normalizzazione del testo: NFD, NFC, NFKD e NFKC.

NFD

NFD, ing. n formalizzazione F orm D ("D" dall'inglese. D ecomposizione), la forma di normalizzazione D è la decomposizione canonica - un algoritmo in base al quale viene eseguita la sostituzione ricorsiva di simboli monolitici (ing. personaggi precomposti) in più componenti (ing. caratteri compositi) secondo le tabelle di scomposizione.

Å
U + 00C5
UN
U + 0041
̊
U + 030A
U + 1E69
S
U + 0073
̣
U + 0323
̇
U + 0307
ḍ̇
U + 1E0B U + 0323
D
U + 0064
̣
U + 0323
̇
U + 0307
Q
U + 0071 U + 0307 U + 0323
Q
U + 0071
̣
U + 0323
̇
U + 0307

NFC

NFC, ing. n formalizzazione F orm C ("C" dall'inglese. C omposizione), la forma di normalizzazione C è un algoritmo secondo il quale la decomposizione canonica e la composizione canonica vengono eseguite in sequenza. Innanzitutto, la decomposizione canonica (algoritmo NFD) riduce il testo alla forma D. Quindi la composizione canonica, l'inverso di NFD, elabora il testo dall'inizio alla fine, tenendo conto delle seguenti regole:

  • simbolo S conta iniziale se ha una classe di modifica uguale a zero secondo la tabella dei caratteri Unicode;
  • in qualsiasi sequenza di caratteri che iniziano con il carattere S, simbolo C bloccato da S, solo se tra S e C c'è qualche simbolo? B che è iniziale o ha la stessa classe di modifica o maggiore di C... Questa regola si applica solo alle stringhe che hanno subito una decomposizione canonica;
  • il simbolo conta primario un composito se ha una scomposizione canonica nella tabella dei caratteri Unicode (o una scomposizione canonica per Hangul e non è incluso nell'elenco di esclusione);
  • simbolo X può essere combinato con il simbolo prima se e solo se esiste un composto primario Z, canonicamente equivalente alla successione<X, >;
  • se il prossimo carattere C non bloccato dall'ultimo carattere base iniziale incontrato l e può essere combinato con successo prima con esso, quindi l sostituito da composito L-C, un C RIMOSSO.
o
U + 006F
̂
U + 0302
h
U + 0048
U + 2460
1
U + 0031
U + FF76
U + 30AB
U + FB01
U + FB01
F io
U + 0066 U + 0069
F io
U + 0066 U + 0069
2
U + 0032 U + 2075
2
U + 0032 U + 2075
2
U + 0032 U + 2075
2 5
U + 0032 U + 0035
2 5
U + 0032 U + 0035
ẛ̣
U + 1E9B U + 0323
? ̣ ̇
U + 017F U + 0323 U + 0307
̣
U + 1E9B U + 0323
S ̣ ̇
U + 0073 U + 0323 U + 0307
U + 1E69
questo
U + 0439
e ̆
U + 0438 U + 0306
questo
U + 0439
e ̆
U + 0438 U + 0306
questo
U + 0439
e
U + 0451
e ̈
U + 0435 U + 0308
e
U + 0451
e ̈
U + 0435 U + 0308
e
U + 0451
UN
U + 0410
UN
U + 0410
UN
U + 0410
UN
U + 0410
UN
U + 0410
U + 304C
U + 304B U + 3099
U + 304C
U + 304B U + 3099
U + 304C
U + 2167
U + 2167
U + 2167
V io io io
U + 0056 U + 0049 U + 0049 U + 0049
V io io io
U + 0056 U + 0049 U + 0049 U + 0049
ç
U + 00MI7
C ̧
U + 0063 U + 0327
ç
U + 00MI7
C ̧
U + 0063 U + 0327
ç
U + 00MI7

Lettera bidirezionale

Lo standard Unicode supporta la scrittura di lingue con una direzione da sinistra a destra (eng. da sinistra a destra, LTR), e con scritta da destra a sinistra (ing. da destra a sinistra, RTL) - ad esempio, lettere arabe ed ebraiche. In entrambi i casi, i caratteri sono memorizzati in un ordine "naturale"; la loro visualizzazione, tenendo conto della direzione desiderata della lettera, è fornita dall'applicazione.

Inoltre, Unicode supporta testi combinati che combinano frammenti con diverse direzioni della lettera. Questa funzione è chiamata bidirezionalità(ing. testo bidirezionale, BiDi). Alcuni elaboratori di testo semplificati (ad esempio, in telefono cellulare) può supportare Unicode, ma non il supporto bidirezionale. Tutti i caratteri Unicode sono divisi in diverse categorie: scritti da sinistra a destra, scritti da destra a sinistra e scritti in qualsiasi direzione. I simboli di quest'ultima categoria (principalmente segni di punteggiatura), quando visualizzati, prendono la direzione del testo circostante.

Simboli in primo piano


Diagramma del piano multilingue di base di Unicode

Unicode include praticamente tutti gli script moderni, tra cui:

  • Arabo
  • Armeno,
  • Bengalese,
  • Birmano,
  • verbo
  • greco
  • Georgiano,
  • devanagari,
  • Ebreo,
  • Cirillico,
  • Cinese (i caratteri cinesi sono utilizzati attivamente in giapponese e occasionalmente in coreano),
  • copto,
  • Khmer,
  • Latino,
  • Tamil,
  • coreano (hangul),
  • Cherokee,
  • Etiope,
  • giapponese (che comprende, oltre all'alfabeto sillabico, anche i caratteri cinesi)

Altro.

Per scopi accademici, sono state aggiunte molte scritture storiche, tra cui: rune germaniche, antiche rune turche, scrittura greca antica, geroglifici egizi, cuneiforme, scrittura maya, alfabeto etrusco.

Unicode offre un'ampia gamma di simboli e pittogrammi matematici e musicali.

In linea di principio, Unicode non include le bandiere di stato, i loghi di società e prodotti, sebbene si trovino nei caratteri (ad esempio, il logo Apple nella codifica MacRoman (0xF0) o logo di Windows nel carattere Wingdings (0xFF)). Nei caratteri Unicode, i loghi devono essere posizionati solo nell'area dei caratteri personalizzati.

ISO/IEC 10646

Il Consorzio Unicode lavora a stretto contatto con gruppo di lavoro ISO / IEC / JTC1 / SC2 / WG2, che sta sviluppando lo standard internazionale 10646 (ISO / IEC 10646). La sincronizzazione viene stabilita tra lo standard Unicode e ISO / IEC 10646, sebbene ogni standard utilizzi la propria terminologia e il proprio sistema di documentazione.

Collaborazione del Consorzio Unicode con l'Organizzazione internazionale per la standardizzazione (ing. Organizzazione internazionale per la standardizzazione, ISO ) iniziata nel 1991. Nel 1993, l'ISO ha emesso lo standard DIS 10646,1. Per sincronizzarsi con esso, il Consorzio ha approvato la versione 1.1 dello standard Unicode, che è stata integrata con caratteri aggiuntivi dal DIS 10646.1. Di conseguenza, i valori dei caratteri codificati in Unicode 1.1 e DIS 10646.1 sono esattamente gli stessi.

In futuro è proseguita la collaborazione tra le due organizzazioni. Nel 2000, lo standard Unicode 3.0 è stato sincronizzato con ISO/IEC 10646-1: 2000. La prossima terza versione di ISO/IEC 10646 sarà sincronizzata con Unicode 4.0. Forse queste specifiche saranno anche pubblicate come un unico standard.

Simile ai formati UTF-16 e UTF-32 nello standard Unicode, anche lo standard ISO/IEC 10646 ha due forme principali di codifica dei caratteri: UCS-2 (2 byte per carattere, simile a UTF-16) e UCS-4 (4 byte per carattere, simile a UTF-32). UCS significa multi-ottetto universale(multibyte) set di caratteri codificati(ing. set di caratteri codificati a più ottetti universali ). UCS-2 può essere considerato un sottoinsieme di UTF-16 (UTF-16 senza coppie surrogate) e UCS-4 è sinonimo di UTF-32.

Differenze tra gli standard Unicode e ISO/IEC 10646:

  • lievi differenze terminologiche;
  • ISO/IEC 10646 non include le sezioni necessarie per implementare completamente il supporto Unicode:
    • nessun dato sulla codifica binaria dei caratteri;
    • non c'è descrizione di algoritmi di confronto (ing. collazione) e rendering (ing. rendering) caratteri;
    • non esiste un elenco di proprietà dei simboli (ad esempio, non esiste un elenco di proprietà necessarie per implementare il supporto per bidirezionale (eng. bidirezionale) lettere).

Metodi di presentazione

Unicode ha diverse forme di rappresentazione (eng. Formato di trasformazione Unicode, UTF ): UTF-8, UTF-16 (UTF-16BE, UTF-16LE) e UTF-32 (UTF-32BE, UTF-32LE). Anche il modulo di rappresentazione UTF-7 è stato sviluppato per la trasmissione su canali a sette bit, ma a causa dell'incompatibilità con l'ASCII non è stato diffuso e non è stato incluso nello standard. Il 1 aprile 2005 sono state proposte due presentazioni umoristiche: UTF-9 e UTF-18 (RFC 4042).

I sistemi basati su Microsoft Windows NT e Windows 2000 e Windows XP utilizzano principalmente il modulo UTF-16LE. In stile UNIX sistemi operativi GNU/Linux, BSD e Mac OS X hanno adottato il formato UTF-8 per i file e UTF-32 o UTF-8 per l'elaborazione dei caratteri in memoria ad accesso casuale.

Punycode è un'altra forma di codifica di sequenze di caratteri Unicode nelle cosiddette sequenze ACE, che sono composte solo da caratteri alfanumerici, come consentito nei nomi di dominio.

UTF-8

UTF-8 è la rappresentazione Unicode che fornisce la migliore compatibilità con i sistemi meno recenti che utilizzavano caratteri a 8 bit.

Il testo contenente solo caratteri con un numero inferiore a 128 viene convertito in testo ASCII semplice quando scritto in UTF-8. Al contrario, nel testo UTF-8, viene visualizzato qualsiasi byte con un valore inferiore a 128 carattere ASCII con lo stesso codice

Il resto dei caratteri Unicode è rappresentato da sequenze da 2 a 6 byte di lunghezza (in realtà solo fino a 4 byte, poiché in Unicode non esistono caratteri con codice maggiore di 10FFFF e non si prevede di introdurli in il futuro), in cui il primo byte ha sempre la forma 11xxxxxx e il resto - 10xxxxxx... Non vengono utilizzate coppie di surrogati in UTF-8, 4 byte sono sufficienti per scrivere qualsiasi carattere unicode.

UTF-8 è stato inventato il 2 settembre 1992 da Ken Thompson e Rob Pike e implementato nel Piano 9... Lo standard UTF-8 è ora ufficialmente sancito dalla RFC 3629 e dall'ISO/IEC 10646 Allegato D.

I caratteri UTF-8 sono derivati ​​da Unicode come segue:

Unicode UTF-8: 0x00000000 - 0x0000007F: 0xxxxxxx 0x00000080 - 0x000007FF: 110xxxxxx 10xxxxxx 0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxx

Teoricamente possibile, ma anche non incluso nello standard:

0x00200000 - 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0x04000000 - 0x7FFFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Sebbene UTF-8 ti permetta di specificare lo stesso carattere in diversi modi, solo il più corto è corretto. Il resto dei moduli dovrebbe essere rifiutato per motivi di sicurezza.

Ordine byte

In un flusso di dati UTF-16, il byte basso può essere scritto sia prima di quello alto (eng. UTF-16 little-endian), o dopo il più antico (ing. UTF-16 big-endian). Allo stesso modo, esistono due varianti della codifica a quattro byte: UTF-32LE e UTF-32BE.

Per definire il formato della rappresentazione Unicode all'inizio file di testo la firma è scritta - il carattere U + FEFF (spazio unificatore con larghezza zero), chiamato anche marcatore di sequenza di byte(ing. byte order mark (BOM)). Ciò consente di distinguere tra UTF-16LE e UTF-16BE poiché il carattere U + FFFE non esiste. A volte è anche usato per denotare il formato UTF-8, sebbene la nozione di ordine dei byte non si applichi a questo formato. I file che seguono questa convenzione iniziano con queste sequenze di byte:

UTF-8 EF BB BF UTF-16BE FE FF UTF-16LE FF FE UTF-32BE 00 00 FE FF UTF-32LE FF FE 00 00

Sfortunatamente, questo metodo non distingue in modo affidabile tra UTF-16LE e UTF-32LE, poiché il carattere U + 0000 è consentito da Unicode (sebbene i testi reali inizino raramente con esso).

I file nelle codifiche UTF-16 e UTF-32 che non contengono un BOM devono essere in ordine di byte big-endian (unicode.org).

Unicode e codifiche tradizionali

L'introduzione di Unicode ha cambiato l'approccio alle tradizionali codifiche a 8 bit. Se prima la codifica era specificata dal carattere, ora è specificata dalla tabella di corrispondenza tra questa codifica e Unicode.

In effetti, le codifiche a 8 bit sono diventate una rappresentazione di un sottoinsieme di Unicode. Ciò ha reso molto più semplice creare programmi che devono funzionare con molte codifiche diverse: ora, per aggiungere il supporto per un'altra codifica, è sufficiente aggiungere un'altra tabella di ricerca Unicode.

Inoltre, molti formati di dati consentono di inserire qualsiasi carattere Unicode, anche se il documento è scritto nella vecchia codifica a 8 bit. Ad esempio, puoi utilizzare i codici e commerciali in HTML.

Implementazione

La maggior parte dei sistemi operativi moderni fornisce un certo grado di supporto Unicode.

Nei sistemi operativi della famiglia Windows NT, la codifica UTF-16LE a doppio byte viene utilizzata per la rappresentazione interna dei nomi dei file e di altre stringhe di sistema. Le chiamate di sistema che accettano parametri stringa sono disponibili nelle varianti a byte singolo e doppio byte. Per ulteriori informazioni, vedere l'articolo Unicode sulla famiglia di sistemi operativi Microsoft Windows.

I sistemi operativi simili a UNIX, inclusi GNU/Linux, BSD, OS X, utilizzano la codifica UTF-8 per rappresentare Unicode. La maggior parte dei programmi è in grado di gestire UTF-8 come codifiche tradizionali a byte singolo, indipendentemente dal fatto che un carattere sia rappresentato come diversi byte consecutivi. Per lavorare con i singoli caratteri, le stringhe vengono solitamente ricodificate in UCS-4, in modo che ogni carattere abbia una parola macchina.

Una delle prime implementazioni commerciali di successo di Unicode è stata mercoledì Programmazione Java... Fondamentalmente ha abbandonato la rappresentazione dei caratteri a 8 bit in favore di quella a 16 bit. Questa soluzione ha aumentato il consumo di memoria, ma ci ha permesso di restituire un'astrazione importante alla programmazione: un singolo carattere arbitrario (tipo char). In particolare, un programmatore potrebbe lavorare con una stringa come con un semplice array. Sfortunatamente, il successo non è stato definitivo, Unicode ha superato il limite di 16 bit e da J2SE 5.0, un carattere arbitrario ha ricominciato a occupare un numero variabile di unità di memoria: una char o due (vedi coppia surrogata).

La maggior parte dei linguaggi di programmazione ora supporta le stringhe Unicode, sebbene la loro rappresentazione possa differire a seconda dell'implementazione.

Metodi di input

Poiché nessun layout di tastiera può consentire l'immissione simultanea di tutti i caratteri Unicode, è necessario il supporto dei sistemi operativi e delle applicazioni. metodi alternativi immettere caratteri Unicode arbitrari.

Microsoft Windows

Sebbene a partire da Windows 2000, l'utilità Mappa caratteri (charmap.exe) supporti i caratteri Unicode e consenta di copiarli negli appunti, questo supporto è limitato solo al piano di base (codici carattere U + 0000… U + FFFF). I simboli con codici da U + 10000 "Tabella dei simboli" non vengono visualizzati.

C'è una tabella simile, per esempio, in Microsoft Word.

A volte puoi digitare un codice esadecimale, premere Alt + X e il codice verrà sostituito con il carattere appropriato, ad esempio in WordPad, Microsoft Word. Negli editor, Alt + X esegue anche la trasformazione inversa.

In molti programmi MS Windows, per ottenere Carattere Unicode, tenendo premuto il tasto Alt, digita il valore decimale del codice carattere su tastiera numerica... Ad esempio, le combinazioni Alt + 0171 ("), Alt + 0187 (") e Alt + 0769 (accento) saranno utili durante la digitazione di testi in cirillico. Interessanti anche le combinazioni Alt + 0133 (…) e Alt + 0151 (-).

Macintosh

Mac OS 8.5 e versioni successive supportano un metodo di input chiamato "Unicode Hex Input". Tenendo premuto il tasto Opzione, è necessario digitare il codice esadecimale di quattro cifre del carattere richiesto. Questo metodo consente di inserire caratteri con codici maggiori di U + FFFF utilizzando coppie di surrogati; tali coppie verranno automaticamente sostituite dal sistema operativo con caratteri singoli. Prima di utilizzare questo metodo di input, è necessario attivare nella sezione corrispondente delle impostazioni di sistema e quindi selezionare come metodo di input corrente nel menu della tastiera.

A partire da Mac OS X 10.2, esiste anche un'applicazione Character Palette che consente di selezionare caratteri da una tabella in cui è possibile selezionare caratteri da un blocco specifico o caratteri supportati da un font specifico.

GNU/Linux

GNOME ha anche un'utilità Mappa dei simboli (precedentemente gucharmap) che consente di visualizzare i simboli per un blocco specifico o un sistema di scrittura e fornisce la possibilità di cercare per nome o descrizione di un simbolo. Quando si conosce il codice del carattere desiderato, lo si può inserire secondo lo standard ISO 14755: tenendo premuti i tasti Ctrl + ⇧ Shift, inserire il codice esadecimale (a partire da alcune versioni di GTK +, il codice deve essere inserito premendo "tu"). Il codice esadecimale inserito può avere una lunghezza massima di 32 bit, consentendo di immettere qualsiasi carattere Unicode senza utilizzare coppie di surrogati.

Tutte le applicazioni X Window, inclusi GNOME e KDE, supportano l'input del tasto Compose. Per le tastiere che non dispongono di un tasto Componi dedicato, puoi assegnare qualsiasi tasto a questo scopo, ad esempio ⇪ Blocco maiuscole.

La console GNU / Linux consente anche di inserire un carattere Unicode tramite il suo codice - per questo, il codice decimale del carattere deve essere inserito come cifre del blocco tastiera esteso tenendo premuto il tasto Alt. Puoi inserire i caratteri tramite il loro codice esadecimale: per questo devi tenere premuto il tasto AltGr, e per inserire cifre A-F utilizzare i tasti sul blocco tastiera esteso da BlocNum a Invio (in senso orario). È supportato anche l'input in conformità con ISO 14755. Affinché i metodi di cui sopra funzionino, è necessario abilitare la modalità Unicode nella console chiamando unicode_start(1) e seleziona un carattere adatto chiamando setfont(8).

Mozilla Firefox per Linux supporta l'immissione di caratteri ISO 14755.

Problemi Unicode

In Unicode, l'inglese "a" e il polacco "a" sono lo stesso carattere. Allo stesso modo, la "a" russa e la "a" serba sono considerate lo stesso simbolo (ma diverso dalla "a" latina). Questo principio di codifica non è universale; a quanto pare, una soluzione "per tutte le occasioni" non può assolutamente esistere.

  • I testi cinesi, coreani e giapponesi sono tradizionalmente scritti dall'alto verso il basso, a partire dall'angolo in alto a destra. Il passaggio dall'ortografia orizzontale a quella verticale per queste lingue non è previsto in Unicode - questo deve essere fatto tramite linguaggi di markup o meccanismi interni di elaboratori di testi.
  • Unicode consente pesi diversi dello stesso carattere a seconda della lingua. Quindi, i caratteri cinesi possono avere stili diversi in cinese, giapponese (kanji) e coreano (hancha), ma allo stesso tempo in Unicode sono indicati dallo stesso simbolo (la cosiddetta unificazione CJK), sebbene caratteri semplificati e completi ancora hanno codici diversi... Allo stesso modo, le lingue russa e serba usano uno stile corsivo diverso. P e T(in serbo assomigliano a u e w, vedi corsivo serbo). Pertanto, è necessario assicurarsi che il testo sia sempre contrassegnato correttamente come relativo all'una o all'altra lingua.
  • La traduzione da minuscolo a maiuscolo dipende anche dalla lingua. Ad esempio: in turco ci sono le lettere İi e Iı - quindi, le regole turche per il cambio di caso sono in conflitto con quelle inglesi, che richiedono che "i" sia tradotto in "I". Esistono problemi simili in altre lingue: ad esempio, nel dialetto canadese del francese, il registro è tradotto in modo leggermente diverso rispetto alla Francia.
  • Anche con i numeri arabi, ci sono alcune sottigliezze tipografiche: i numeri possono essere "maiuscoli" e "minuscoli", proporzionali e monospaziati - per Unicode non c'è differenza tra loro. Tali sfumature rimangono con il software.

Alcuni degli svantaggi non sono legati a Unicode stesso, ma piuttosto alle capacità dei processori di testo.

  • I file di testo non latino in Unicode occupano sempre più spazio, poiché un carattere è codificato non da un byte, come in varie codifiche nazionali, ma da una sequenza di byte (l'eccezione è UTF-8 per le lingue il cui alfabeto si adatta in ASCII, nonché la presenza di due caratteri nel testo e più lingue, il cui alfabeto non rientra in ASCII). Il file di caratteri richiesto per visualizzare tutti i caratteri nella tabella Unicode occupa uno spazio di memoria relativamente grande ed è più impegnativo dal punto di vista computazionale rispetto al solo carattere della lingua nazionale dell'utente. Con l'aumento della potenza dei sistemi informatici e la riduzione del costo della memoria e dello spazio su disco, questo problema diventa sempre meno significativo; tuttavia, rimane rilevante per i dispositivi portatili come i telefoni cellulari.
  • Sebbene il supporto Unicode sia implementato nei sistemi operativi più comuni, non tutti sono ancora applicati Software supporti lavoro corretto con lui. In particolare, i Byte Order Mark (BOM) non vengono sempre elaborati e i caratteri accentati sono scarsamente supportati. Il problema è temporaneo ed è una conseguenza della novità comparativa degli standard Unicode (rispetto alle codifiche nazionali a byte singolo).
  • Le prestazioni di tutti i programmi di elaborazione delle stringhe (inclusi gli ordinamenti nel database) diminuiscono quando viene utilizzato Unicode invece delle codifiche a byte singolo.

Alcuni rari sistemi di scrittura non sono ancora rappresentati correttamente in Unicode. La rappresentazione di caratteri apici "lunghi" che si estendono su più lettere, come, ad esempio, nello slavo ecclesiastico, non è stata ancora implementata.

Unicode o Unicode?

"Unicode" è sia un nome proprio (o parte di un nome, ad esempio Unicode Consortium) sia un nome comune derivato dalla lingua inglese.

A prima vista, è preferibile utilizzare l'ortografia "Unicode". Nella lingua russa esistono già morfemi "uni-" (le parole con l'elemento latino "uni-" erano tradizionalmente tradotte e scritte attraverso "uni-": universale, unipolare, unificazione, uniforme) e "codice". Contro, marchi di fabbrica, mutuati dalla lingua inglese, vengono solitamente trasmessi attraverso la trascrizione pratica, in cui la combinazione di lettere "uni-" de-etimologizzata è scritta come "uni-" ("Unilever", "Unix", ecc.), cioè, allo stesso modo del caso di acronimi lettera per lettera come UNICEF "Fondo internazionale di emergenza per l'infanzia delle Nazioni Unite" - UNICEF.

L'ortografia di "Unicode" è già entrata saldamente nei testi in lingua russa. Wikipedia usa la versione più comune. Su MS Windows, viene utilizzata l'opzione Unicode.

C'è una pagina speciale sul sito del Consorzio, dove i problemi di trasferimento della parola "Unicode" a lingue differenti e sistemi di scrittura. Per l'alfabeto cirillico russo, è specificata l'opzione "Unicode".

I problemi associati alle codifiche sono generalmente gestiti dal software, quindi di solito non ci sono difficoltà nell'uso delle codifiche. Se sorgono difficoltà, di solito sono generate da programmi non validi: sentiti libero di inviarle nel cestino.

Invito tutti a parlare in

Che cos'è la codifica?

In russo, "set di caratteri" è anche chiamato tabella "set di caratteri" e il processo di utilizzo di questa tabella per tradurre le informazioni da una rappresentazione del computer in una umana e una caratteristica di un file di testo, che riflette l'uso di un certo sistema di codici in esso durante la visualizzazione del testo.

Come viene codificato il testo

L'insieme dei simboli utilizzati nella scrittura del testo è indicato nella terminologia informatica come alfabeto; il numero di simboli nell'alfabeto è solitamente chiamato il suo potere. Per rappresentare le informazioni testuali in un computer, viene spesso utilizzato un alfabeto con una capacità di 256 caratteri. Uno dei suoi caratteri porta 8 bit di informazione, quindi il codice binario di ogni carattere occupa 1 byte di memoria del computer. Tutti i caratteri di tale alfabeto sono numerati da 0 a 255 e ogni numero corrisponde a un codice binario a 8 bit, che è il numero ordinale di un carattere nel sistema numerico binario - da 00000000 a 11111111. Solo i primi 128 caratteri con numeri da zero (codice binario 00000000) a 127 (01111111). Questi includono lettere minuscole e lettere maiuscole Alfabeto latino, numeri, segni di punteggiatura, parentesi quadre, ecc. I restanti 128 codici, che iniziano con 128 (codice binario 10000000) e terminano con 255 (11111111), vengono utilizzati per codificare lettere di alfabeti nazionali, simboli ufficiali e scientifici.

Tipi di codifiche

La tabella di codifica più famosa è ASCII (American Standard Code for Information Interchange). È stato originariamente sviluppato per la trasmissione di testi tramite telegrafo e all'epoca era a 7 bit, ovvero solo 128 combinazioni a 7 bit venivano utilizzate per codificare caratteri inglesi, caratteri di servizio e di controllo. In questo caso, le prime 32 combinazioni (codici) servivano a codificare segnali di controllo (inizio testo, fine riga, ritorno a capo, chiamata, fine testo, ecc.). Nello sviluppo dei primi computer IBM, questo codice è stato utilizzato per rappresentare i simboli in un computer. Dal in codice sorgente ASCII era di soli 128 caratteri, per la loro codifica bastavano i valori di byte, in cui l'8° bit è 0. I valori di byte con l'8° bit uguale a 1, iniziarono ad essere usati per rappresentare caratteri pseudo-grafici, segni matematici e alcuni caratteri di lingue diverse dall'inglese (greco, tedesco dieresi, segni diacritici francesi, ecc.). Quando hanno iniziato ad adattare i computer per altri paesi e lingue, non c'era più spazio per nuovi simboli. Per supportare completamente lingue diverse dall'inglese, IBM ha introdotto diverse tabelle di codici specifiche per paese. Quindi per i paesi scandinavi è stata proposta la tabella 865 (nordica), per i paesi arabi - tabella 864 (araba), per Israele - tabella 862 (Israele) e così via. In queste tabelle alcuni dei codici della seconda metà della tabella dei codici sono stati utilizzati per rappresentare i caratteri degli alfabeti nazionali (escludendo alcuni caratteri pseudografici). La situazione con la lingua russa si è sviluppata in modo speciale. Ovviamente si può fare la sostituzione dei caratteri nella seconda metà della tabella codici diversi modi... Quindi, sono apparse diverse tabelle di codifica dei caratteri cirillici per la lingua russa: KOI8-R, IBM-866, CP-1251, ISO-8551-5. Tutti rappresentano i simboli della prima metà della tabella allo stesso modo (da 0 a 127) e differiscono nella rappresentazione dei simboli dell'alfabeto russo e della pseudo-grafica. Per lingue come il cinese o il giapponese, generalmente 256 caratteri non sono sufficienti. Inoltre, c'è sempre il problema di emettere o salvare in un file contemporaneamente i testi su lingue differenti(ad esempio, quando si cita). Pertanto, un universale tabella dei codici UNICODE, contenente simboli utilizzati nelle lingue di tutti i popoli del mondo, oltre a vari simboli di servizio e ausiliari (segni di punteggiatura, simboli matematici e tecnici, frecce, segni diacritici, ecc.). Ovviamente un byte non è sufficiente per codificare un numero così elevato di caratteri. Pertanto UNICODE utilizza codici a 16 bit (2 byte) per rappresentare 65.536 caratteri. Ad oggi sono stati utilizzati circa 49.000 codici (l'ultimo cambiamento significativo è stato l'introduzione del simbolo della valuta EURO nel settembre 1998). Per compatibilità con le codifiche precedenti, i primi 256 codici sono gli stessi dello standard ASCII. Nello standard UNICODE, salvo specifiche codice binario(questi codici sono solitamente indicati dalla lettera U, seguita dal segno + e dal codice vero e proprio in rappresentazione esadecimale) ad ogni carattere viene assegnato un nome specifico. Un altro componente dello standard UNICODE sono gli algoritmi per la conversione uno a uno dei codici UNICODE in una sequenza di byte di lunghezza variabile. La necessità di tali algoritmi è dovuta al fatto che non tutte le applicazioni sono in grado di funzionare con UNICODE. Alcune applicazioni comprendono solo i codici ASCII a 7 bit, altre applicazioni comprendono i codici ASCII a 8 bit. Tali applicazioni utilizzano i cosiddetti codici ASCII estesi per rappresentare caratteri che non rientrano in un insieme di 128 o 256 caratteri, rispettivamente, quando i caratteri sono codificati con stringhe di byte di lunghezza variabile. UTF-7 viene utilizzato per convertire in modo reversibile i codici UNICODE in codici ASCII estesi a 7 bit e UTF-8 viene utilizzato per convertire in modo reversibile i codici UNICODE in codici ASCII estesi a 8 bit. Nota che sia ASCII che UNICODE e altri standard di codifica dei caratteri non definiscono le immagini dei caratteri, ma solo la composizione del set di caratteri e il modo in cui è rappresentato in un computer. Inoltre (cosa che potrebbe non essere immediatamente ovvia), l'ordine di enumerazione dei caratteri nell'insieme è molto importante, poiché influisce in modo più significativo sugli algoritmi di ordinamento. È la tabella di corrispondenza dei simboli di un certo insieme (diciamo, simboli usati per rappresentare informazioni su lingua inglese, o in lingue diverse, come nel caso di UNICODE) e denotiamo con il termine tabella di codifica dei caratteri o set di caratteri. Ogni codifica standard ha un nome, ad esempio KOI8-R, ISO_8859-1, ASCII. Sfortunatamente, non esiste uno standard per la codifica dei nomi.

Codifiche comuni

ISO 646 o ASCII EBCDIC ISO 8859: o ISO 8859-1 - ISO 8859-11, ISO 8859-13, ISO 8859-14, ISO 8859-15 o CP437, CP737, CP850, CP852, CP855, CP857, CP858, CP860, CP861, CP863, CP865, CP866, CP869 Codifiche Microsoft Windows: o Windows-1250 per le lingue dell'Europa centrale che utilizzano lettere latine o Windows-1251 per gli alfabeti cirillici o Windows-1252 per le lingue occidentali o Windows-1253 per il greco o Windows-1254 per il turco o Windows-1255 per l'ebraico o Windows-1256 per l'arabo o Windows-1257 per le lingue baltiche o Windows-1258 per il vietnamita MacRoman, MacCyrillic KOI8 (KOI8-R, KOI8-U ...), KOI-7 codifica bulgara ISCII VISCII Big5 (il più famoso versione di Microsoft CP950 ) o HKSCS Guobiao o GB2312 o GBK (Microsoft CP936) o GB18030 Shift JIS per giapponese (Microsoft CP932) EUC-KR per coreano (Microsoft CP949) ISO-2022 ed EUC per scrittura cinese UTF-8 e UTF-16 codifiche caratteri Unicode

Nel sistema di codifica ASCII(American Standard Code for Information Interchange) ogni carattere è rappresentato da un byte, che può codificare 256 caratteri.

ASCII ha due tabelle di codifica: base ed estesa. La tabella base fissa i valori dei codici da 0 a 127, e quella estesa si riferisce a caratteri con numeri da 128 a 255. Questo è sufficiente per esprimere con varie combinazioni di otto bit tutti i caratteri delle lingue inglese e russa , sia minuscolo che maiuscolo, nonché segni di punteggiatura, simboli per operazioni aritmetiche di base e simboli speciali comuni che possono essere osservati sulla tastiera.

I primi 32 codici della tabella di base, che iniziano con zero, vengono dati ai produttori di hardware (principalmente ai produttori di computer e dispositivi di stampa). Quest'area contiene i cosiddetti codici di controllo, che non corrispondono ad alcun carattere di lingua, e, di conseguenza, questi codici non vengono visualizzati né sullo schermo né sui dispositivi di stampa, ma possono essere controllati come vengono emessi altri dati. A partire dal codice 32 al codice 127 vengono posti i simboli dell'alfabeto inglese, punteggiatura, numeri, operazioni aritmetiche e simboli ausiliari, tutti visibili sulla parte latina della tastiera del computer.

La seconda parte estesa è dedicata ai sistemi di codifica nazionali. Ci sono molti alfabeti non latini nel mondo (arabo, ebraico, greco, ecc.), incluso l'alfabeto cirillico. Inoltre, i layout di tastiera tedesca, francese e spagnola sono diversi da quelli inglesi.

La parte inglese della tastiera aveva molti standard, ma ora sono stati tutti sostituiti da un unico codice ASCII. Per la tastiera russa c'erano anche molti standard: GOST, GOST-alternative, ISO (International Standard Organization - International Institute for Standardization), ma questi tre standard sono effettivamente estinti, sebbene possano incontrarsi da qualche parte, in alcuni computer antidiluviani o in reti informatiche.

La codifica dei caratteri principali della lingua russa, utilizzata nei computer con un'operazione Sistema Windows chiamato Windows-1251, è stato sviluppato per gli alfabeti cirillici da Microsoft. Naturalmente, la maggioranza assoluta dei dati di testo del computer è codificata in Windows-1251. A proposito, Microsoft ha sviluppato codifiche con un numero di quattro cifre diverso per altri alfabeti comuni: arabo, giapponese e altri.

Un'altra codifica comune è chiamata KOI-8(codice di scambio di informazioni, otto cifre) - la sua origine risale ai tempi del Consiglio per la mutua assistenza economica degli Stati dell'Europa orientale. Oggi la codifica KOI-8 è diffusa nelle reti di computer sul territorio della Russia e nel settore russo di Internet. Accade così che parte del testo della lettera o qualcos'altro non sia leggibile, il che significa che è necessario passare da KOI-8 a Windows-1251. 10

Negli anni '90, i più grandi produttori di software: Microsoft, Borland, la stessa Adobe hanno deciso la necessità di sviluppare un diverso sistema di codifica del testo, in cui a ciascun carattere verrà assegnato non 1, ma 2 byte. Ha preso il nome Unicode, ed è possibile codificare 65.536 caratteri di questo campo è sufficiente per inserirsi in una tabella di alfabeti nazionali per tutte le lingue del pianeta. La maggior parte di Unicode (circa il 70%) è occupata da caratteri cinesi, in India ci sono 11 diversi alfabeti nazionali, ci sono molti nomi esotici, ad esempio: la scrittura degli aborigeni canadesi.

Poiché la codifica di ciascun carattere in Unicode non è assegnata a 8, ma a 16 bit, la dimensione del file di testo è raddoppiata. Questo una volta era un ostacolo all'introduzione di un sistema a 16 bit. e ora, con dischi rigidi da gigabyte, centinaia di megabyte di RAM, processori gigahertz, raddoppiando il volume dei file di testo, che, rispetto, ad esempio, alla grafica, occupano pochissimo spazio, non ha molta importanza.

L'alfabeto cirillico in Unicode va da 768 a 923 (caratteri di base) e da 924 a 1023 (cirillico esteso, varie lettere nazionali meno comuni). Se il programma non è adattato per l'Unicode cirillico, è possibile che i caratteri di testo non vengano riconosciuti come cirillici, ma come latini estesi (codici da 256 a 511). E in questo caso, invece del testo, sullo schermo appare un insieme insignificante di vari simboli esotici.

Ciò è possibile se il programma è obsoleto, creato prima del 1995. O uno raro, di cui nessuno si è preoccupato di russificare. È anche possibile che il sistema operativo Windows installato sul computer non sia completamente configurato per l'alfabeto cirillico. In questo caso, è necessario inserire le voci appropriate nel registro.