CODIFICA DEI CARATTERI A lunghezza fissa: 7 bit (ASCII) 8 bit (ISO 8859: Latin-1, Latin-2 Latin-15) A lunghezza fissa: 16, 32 bit (UCS-2, UCS-4) A lunghezza variabile: da 1 a 4 byte (UTF-8 e UTF-16) Si consiglia la lettura http://maxpiano.altervista.org/unicode/intro.php?page=7 Raffaella Gasparotto Set di caratteri appunti novembre 2012 1
Set di caratteri a lunghezza fissa ASCII (American Standard Code for Information Interchange) standard ANSI (X3.4-1968) che definisce valori per 128 caratteri, ovvero 7 bit su 8 (l ottavo bit è utilizzato per il controllo di parità). ASCII possiede 33 caratteri (0-31 e 127) di controllo 8 (BACKSPACE, CR, LF ) Gli altri 95 sono caratteri dell'alfabeto latino, maiuscole e minuscole, numeri e punteggiatura. ISO 8859: Estensioni di ASCII sono state fatte per utilizzare tutti gli 8 bit senza controllo di parità. Lettera T / 1 0 1 0 1 0 0 ASCII 0 1 0 1 0 1 0 0 ISO 8859 Latin 1 2
TABELLE DI CARATTERI UNICODE Al momento sono stati definiti 95'221 caratteri diversi, appartenenti a tre categorie: Script moderni Latin; Greek; Cyrillic; Armenian; Hebrew; Arabic; Syriac; Thaana; Devanagari; Bengali; Gurmukhi; Oriya; Tamil; Telegu; Kannada; Malayalam; Sinhala; Thai; Lao; Tibetan; Myanmar; Georgian; Hangul; Ethiopic; Cherokee; Canadian-Aboriginal Syllabics; Ogham; Runic; Khmer; Mongolian; Han (Japanese, Chinese, Korean ideographs); Hiragana; Katakana; Bopomofo and Yi Script antichi Aegean; Alphabetic and syllabic LTR & RTL; Brahmic; African scripts; Scripts for invented languages; Cuneiform; Undeciphered scripts; North American ideographs and pictograms; Egyptian and Mayan hieroglyphs; Sumerian pictograms; Large Asian scripts; Segni speciali punctuation marks, diacritics, mathematical symbols, technical symbols, arrows, dingbats, etc 3
Character Encoding Tutti I simboli sono rappresentati in una tabella UNICODE. Il CODE POINT è la posizione del carattere nella tabella. Il CODE POINT non è la RAPPRESENTAZIONE del carattere. I due concetti coincidono per L'ASCII (0-127 caratteri), ISO- 8859-1(0-255 caratteri) Windows-1252(0,255) e per il 1- byte UTF-8 (0-127 caratteri) Ma Non lo è per la codifica multi-byte UTF-8.ere.
UTF-8 può rappresentare qualsiasi linguaggio al mondo. COMPLETAMENTE ASCII-compatible, ma non è Latin-1 compatible (..PERCHE??). UTF-8 usa da 1 a 4 byte. Quando usa un solo byte, UTF-8 = ASCII (a 7 bit) E il code point = representation. Esempi di 1-byte UTF-8: A -> 0100 0001 & -> 0010 0110 5 -> 0011 0101
Codifica di caratteri a lunghezza variabile: UTF-8 In generale, il primo byte contiene tanti 1 quanti sono i byte complessivi usati per rappresentare il carattere (lunghezza). 0xxxxxxx UTF-8 110yyyyx 10xxxxxx UTF-8 1110 z z z z 10 z yyyyx 10xxxxxx UTF-8 Il secondo byte o i successivi byte contengono la sequenza: - '10' bit di continuazione seguito da - 6 bit significativi per la rappresentazione del code point 6
Codifica UTF-8 con 2-byte HA code point!= representation visto che il code point viene distribuito nei 2 byte come rappresentato 1 1 0 x x x x x 1 0 x x x x x x Codifica UTF-8 con 3-byte HA code point!= representation visto che il code point viene distribuito nei 3 byte come rappresentato e nel byte più significativo, si pone 1110 1 1 1 0 x x x x 1 0 x x x x x x 1 0 x x x x x x Analogamente la Codifica UTF-8 con 4-byte HA code point!= representation
COME CALCOLARE I BYTE NECESSARI? Range di caratteri UTF-8 octet sequence (hexadecimal) (binary) --------------------------------+--------------------------------------------- 0000 0000-0000 007F 0xxxxxxx 0000 0080-0000 07FF 110xxxxx 10xxxxxx 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
ESEMPIO CODIFICA UTF-8 La sequenza di caratteri Lällê si codifica in UTF-8 come segue: 76 195 164 108 108 195 170 L ä l l ê ASCII76 UNICODE228 ASCII108 UNICODE234 I codici ASCII dei caratteri L e l vengono preservati così come sono in UTF-8. Il carattere ä ha codice UNICODE 228. Siccome 128 228 2.047, saranno necessari due ottetti (byte) per la sua codifica in UTF-8. Questi ultimi avranno la seguente configurazione: 110xxxxx 10xxxxxx NB: - 11 perché uso 2 byte per la rappresentazione del numero - ora dobbiamo dare un valore alle x mancanti. Raffaella Gasparotto Set di caratteri 2010 9
228 in binario si scrive 11100100 e utilizzando gli 11 bit liberi (quelli indicati con x) otteniamo la rappresentazione binaria 00011100100. A partire dai bit meno significativi (a destra) suddividiamo la rappresentazione binaria di 228 in due parti composte da 6 e 5 bit come segue: 00011100100 00011 100100 Ora siamo in grado di completare la codifica UTF-8 specificando i valori delle singole x come segue: 110 x x x x x 1 0 x x x x x x 0 0 0 1 1 1 0 0 1 0 0 110 0 0 0 1 1 10 1 0 0 1 0 0 (195)10 (164)10 Raffaella Gasparotto Set di caratteri 2010 10
Per il carattere ê (codice UNICODE 234) si procede in modo analogo, a partire dalla sua rappresentazione binaria a 11 bit: 00011101010 = 0 0 0 1 1 U 1 0 1 0 1 0 110 x x x x x 10 x x x x x x 110 0 0 0 1 1 10 1 0 1 0 1 0 (195)10 (170)10 Quindi la codifica binaria finale della sequenza di caratteri Lällê è la seguente: 01001100 L (ASCII 76) 11000011 ä (UNICODE 228) 10100100 01101100 l (ASCII 108) 01101100 l (ASCII 108) 11000011 ê(unicode 234) 10101010 Raffaella Gasparotto Set di caratteri 2010 11
ALTRI ESEMPI Codifica UTF-8 ( code point!= representation)
U+0026, la e commerciale, occupa un byte. U+0416, Cyrillic zhe, sono 2 bytes (in hex): D0, 96. U+4E2D, the Chinese character, sono 3 bytes: E4, B8, AD. U+10346, from the astral plane, sono 4by: F0, 90, 8D, 86.
Cosa significa se compare Niño sostituita da Ni?o Niño sostituita da Ni o Il carattere di sostituzione (spesso un diamante nero con un punto interrogativo bianco) è usato per indicare che il sistema non è in grado di decodificare un flusso di dati in un simbolo corretto. ha Code point U+FFFD e quindi la codifica UTF-8 è 0xEF 0xBF 0xBD (verifica la codifica per esercizio!!)
Si consideri un file di testo contenente la parola tedesca für codificata in ISO-8859-1. Se ora apro questo testo con un editor di testo UTF-8 osservo: 1) il primo byte (f=66) è interpreto correttamente come un f. 2) Il secondo byte (ü=fc) non è un valore legale per l'avvio di qualsiasi caratteri UTF-8 codificato in quanto il bit più significativo non è 0 bensì 1 perchè la ü è codificata ISO-8859-1. QUINDI L'editor di testo UTF-8 sostituisce questo byte non compatibile con il simbolo per avvertire l'utente che qualcosa è andato storto. 3) L'ultimo byte (0x72) è anche nel campo codice 0x00-0x7F e può essere decodificato correttamente. L'intera stringa ora mostra in questo modo: f r
Se ora l'editor di testo UTF-8 salva la parola f r La codifica salvata è 66 EF BF BD 72 Riaprendola con un editor di testo ISO-8859-1, verrà visualizzato in ISO-8859-1 di nuovo come f ï» r 66 EF BF BD 72 È solo un esempio dell'encoding Hell!!!