mercoledì 21 marzo 2012

I principi fondamentali di Unicode

Questo contenuto è parte della zona di Python , che viene presentato a voi da DZone e Relic New . Visita la Zona Python per notizie, suggerimenti e tutorial sul linguaggio di programmazione Python. fornisce lerisorse e le best practice per aiutarti a monitorare queste applicazioni.
Un'introduzione ai principi fondamentali di Unicode, distillato da diversi post precedenti. Ai fini della presentazione del quadro generale, ho dipinto con un pennello largo - grandi aree sono riassunte; lendini non sono raccolte, peli non sono divisi, resistenza al vento viene ignorato.

Unicode = un set di caratteri, oltre a codifiche diverse

Unicode in realtà non è una cosa, ma due cose separate e distinte. Il primo è un insieme di caratteri e il secondo è un insieme di codifiche .
  • Il primo - l'idea di un set di caratteri - non ha assolutamente nulla a che fare con i computer.
  • La seconda - l'idea di codifiche per il set di caratteri Unicode - ha a che fare con i computer.


Set di caratteri

L'idea di un set di caratteri non ha nulla a che fare con i computer. Quindi supponiamo che tu sei un linguista britannico vive, diciamo, 1750. L'impero britannico si sta espandendo e gli europei stanno scoprendo molte nuove lingue, sia vivi e morti. Hai saputo caratteri cinesi per lungo tempo, e hai appena scoperto caratteri cuneiformi sumere dal Medio Oriente e caratteri in sanscrito dall'India.
Cercando di fare con questa massa enorme di personaggi diversi, si ottiene una brillante idea - si farà un elenco numerato di ogni personaggio in tutte le lingue che sia mai esistito.
Si inizia l'elenco con il proprio set familiare di caratteri inglesi - le lettere maiuscole e minuscole, le cifre numeriche, ei segni di punteggiatura diverse, come periodo (punto), virgola, punto esclamativo, e così via. E il carattere di spazio, naturalmente.

01.01 A
02.b 02
03.c 03
04....
05.z 26
06.27 A
07.B 28
08....
09.Z 52
10.53 0
11.1 54
12.2 55
13....
14.9 62
15.63 (spazio)
16.64? (Punto interrogativo)
17.65, (virgola)
18.... e così via ...
Poi si aggiungono gli spagnoli, i caratteri francesi e tedeschi, con tilde, accenti e dieresi. È possibile aggiungere caratteri di altre lingue vive - greco, giapponese, cinese, coreano, sanscrito, arabo, ebraico, e così via. È possibile aggiungere caratteri di alfabeti morti - assiro cuneiforme - e così via, finché si dispone di una lista molto lunga di caratteri.
  • Quello che hai creato - un elenco numerato di personaggi - è conosciuto come un set di caratteri .
  • I numeri nella lista - gli identificatori numerici dei caratteri nel set di caratteri - sono chiamati punti di codice .
  • E poiché l'elenco è destinato ad includere ogni personaggio che sia mai esistito, si chiama il tuo personaggio impostare il set di caratteri universale .

Congratulazioni! Hai appena inventato (qualcosa di simile) la prima metà del Unicode - l' Universal Character Set o UCS .


Codifiche

Ora supponiamo che si salta nella tua macchina del tempo e zip in avanti per il presente. Ognuno utilizza i computer. Avete una idea brillante. Potrai trovare un modo per i computer per gestire UCS.
Tu sai che i computer pensano in uni e zeri - bit - e le collezioni di 8 bit - byte. Così si guarda al maggior numero nel vostro UCS e chiedetevi: quanti bytes ho bisogno di memorizzare un numero così grande? La risposta è venuta in mente è di 4 byte, 32 bit. Così si decide su una semplice implementazione e straight-forward digitale di UCS - ogni numero verrà memorizzato in 4 byte. Cioè, si sceglie una codifica a lunghezza fissa in cui ogni personaggio UCS (punto di codice) può essere rappresentata, o codificati , in esattamente 4 byte o 32 bit.
In breve, si concepire l'Unicode UCS-4 (Universal Character Set, 4 byte) di codifica, alias UTF-32 (Unicode Transformation Format, 32 bit) .


UTF-8 e di lunghezza variabile codifiche

UCS-4 è semplice e diretto ... ma inefficiente. Computer inviare un sacco di stringhe avanti e indietro, e molte di queste stringhe utilizzare solo caratteri ASCII - personaggi dal vecchio set di caratteri ASCII. Un byte - otto bit - è più che sufficiente per memorizzare i caratteri del genere. E 'gravemente inefficiente di usare 4 byte per memorizzare un carattere ASCII.
La chiave per la soluzione è quella di ricordare che un punto di codice non è altro che un numero (un intero). Esso può essere un numero breve o lungo un numero, ma è solo un numero. Abbiamo bisogno di un solo byte per memorizzare i numeri più brevi del set di caratteri universale, e abbiamo bisogno di più byte solo quando i numeri si allungano. Quindi la soluzione al nostro problema è una lunghezza variabile codifica.
In particolare, Unicode UTF-8 (Unicode Transformation Format, 8 bit) è una codifica a lunghezza variabile in cui è codificato ogni punto di codice UCS utilizzando 1, 2, 3, o 4 byte, come necessario.
In UTF-8, se il primo bit di un byte è uno "0", allora i rimanenti 7 bit del byte contengono uno dei 128 originali 7-bit ASCII caratteri. Se il primo bit del byte è un "1", allora il byte è il primo byte multipli usati per rappresentare il punto di codice, e altri bit del byte portano altre informazioni, come il numero totale di byte - 2, o 3 , o 4 byte - che vengono utilizzati per rappresentare il punto di codice. (Per una rapida panoramica di come funziona a livello di bit, vedere Come funziona UTF-8 "a larghezza variabile encoding" di lavoro? )


Basta usare UTF-8

UTF-8 è una grande tecnologia, è per questo che è diventato de facto standard per la codifica del testo Unicode, ed è la codifica del testo più utilizzato al mondo. Stringhe di testo che utilizzano solo i caratteri ASCII possono essere codificati in UTF-8 utilizzando un solo byte per carattere, che è molto efficiente. E se personaggi, caratteri cinesi o giapponesi, per esempio - richiede più byte, beh, UTF-8 può fare anche quello.


Byte Order Mark

Unicode a lunghezza fissa multi-byte codifiche come UTF-16 e UTF-32 memorizzare i punti del codice UCS (interi) in multi-byte blocchi - 2-byte blocchi in caso di UTF-16 e 4-byte blocchi nel caso di UTF-32.
Purtroppo, architetture diverse - fondamentalmente, chip del processore diverse - utilizzano diverse tecniche per la memorizzazione di questi multi-byte interi. In "little-endian" i computer, la "piccola" (meno significativo) in byte di un multi-byte integer viene memorizzato più a sinistra. "Big-endian" i computer fanno il contrario, il "big" (più significativo) byte viene memorizzato più a sinistra.
  • Computer Intel sono little-endian.
  • Computer Motorola sono big-endian.
  • Microsoft Windows è stato progettato intorno ad un little-endian architettura - funziona solo su little-endian computer o computer in esecuzione in modalità little-endian - ed è per questo hardware Intel e software Microsoft incastrano tra loro come la mano e il guanto.

Le differenze di endian in grado di creare problemi di scambio dati tra computer. In particolare, la possibilità di differenze di endian significa che se due computer hanno bisogno di scambiare una stringa di dati di testo, e che la stringa viene codificato in un Unicode a lunghezza fissa codifica multi-byte come UTF-16 o UTF-32, il stringa deve iniziare con un Byte Order Mark (o BOM ) - un carattere speciale all'inizio della stringa che indica il tipo di endian della stringa.
Strings codificati in UTF-8 non richiedono una distinta, in modo che il BOM è fondamentalmente un non-problema per i programmatori che usano solo UTF-8.


Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.