際際滷

際際滷Share a Scribd company logo
Perch息 l'encoding
即 importante?
2015 Francesco Sblendorio
Perch辿 questo talk?
Scambio di file CSV problematico
Francesco;Via Torino;347-101212;1977-01-01
Filippo;Piazza Duomo;328-923212;1980-02-04
Luisa;Piazza Cordusio;02-123456;1979-03-12
Name,Address,Birthdate
Francesco,Via Torino,1977-01-01
Filippo,Piazza Duomo,1980-02-04
Luisa,Piazza Cordusio,1979-03-12
Name,Address,Birthdate
Ars竪ne,50 rue de Varenne,1977-01-01
Ad辿la誰de,134 rue du Fbg. St-Honor辿,1980-02-04
B辿n辿dicte,rue de la Paix,1979-03-12
Name,Address,Birthdate
Ars?ne,50 rue de Varenne,1977-01-01
Ad?la?de,134 rue du Fbg. St-Honor?,1980-02-04
B?n?dicte,rue de la Paix,1979-03-12
Name,Address,Birthdate
亳仆舒,仍. 仂仆从舒,1977-01-01
仆亟亠亶,仂仗亠从 于亠仆舒亟从仂亞仂,1980-02-04
亳从仂亳,亠于从亳亶 仗仂仗亠从,1979-03-12
Name,Address,Birthdate
?????,??. ???????,1977-01-01
??????,???????? ???????????,1980-02-04
????????,??????? ????????,1979-03-12
Il problema della codifica
 Stabilire una corrispondenza tra simboli e codici numerici (bytes)
 A=... B= C=... D=... E=...
 Quali sono i caratteri da rappresentare?
IEC646
1972
ASCII
1968
PETSCII
1977
EBCDIC
~1960
0 1 1 0 1 0 0 1
Standard: ASCII 7-bit (US-ASCII)
 7 bit di codifica (+ 1 bit di parit): 128 combinazioni
 a..z A..Z 0..9 !"#$%&'()*+,-./:;<=>?@[]^_{|}~
 32 caratteri di controllo cosiddetti non-stampabili (CR, LF, backspace, )
Vantaggi
 Ordinamento alfabetico + numerico intrinseco
 1 carattere  1 byte (per definizione)
0 x x x x x x x
Problema
 Adatto solo alla lingua inglese
 Impossibile codificare accenti, dittonghi, dieresi e alfabeti non latini
 Es. in italiano si usava lapostrofo come workaround (e - perche - pero)
Soluzioni locali: Extended ASCII (8-bit)
 Usare il vecchio bit di parit per raddoppiare
le combinazioni (che diventano 256)
 Per diverse famiglie linguistiche esistono diverse varianti di Extended ASCII
 Le prime 127 combinazioni sono le stesse di US-ASCII, le altre dipendono da
quale variante di Extended ASCII viene utilizzata
 Esempi: CODEPAGEs in MS-DOS
x x x x x x x x
Soluzioni locali: Extended ASCII (8-bit)
Non - printable
US ASCII (7-bit)
Extended
Soluzioni locali: Extended ASCII (8-bit)
Non - printable
US ASCII (7-bit)
Extended
Soluzioni locali: Extended ASCII (8-bit)
Non - printable
US ASCII (7-bit)
Extended
Soluzioni locali: Extended ASCII (8-bit)
Superset di
ISO-8859-1
(o latin1)
Non - printable
US ASCII (7-bit)
Extended
Globalizzazione e Unicode
 Necessit di scambiare informazioni fra parti diverse del mondo
 Necessit di usare pi湛 alfabeti nello stesso documento
Name,Address,Birthdate
亳仆舒,仍. 仂仆从舒,1977-01-01
仆亟亠亶,仂仗亠从 于亠仆舒亟从仂亞仂,1980-02-04
Ars竪ne,50 rue de Varenne,1977-01-01
Ad辿la誰de,134 rue du Fbg. St-Honor辿,1980-02-04
B辿n辿dicte,rue de la Paix,1979-03-12
亳从仂亳,亠于从亳亶 仗仂仗亠从,1979-03-12
Globalizzazione e Unicode
 Idea iniziale: usare 2 byte per carattere = 65536 combinazioni possibili
 5 anni dopo la versione 1.0 si giungono ad assegnare 178500 combinazioni
 La versione 8.0 (2015) assegna 260319 combinazioni
 2 byte non sono pi湛 sufficienti: Unicode 竪 una specifica da codificare a sua
volta
 Curiosit: sono assegnati anche simboli di alfabeti appartenenti a lingue
artificiali, come i Tengwar della lingua elfica creata da J.R.R Tolkien e
parlata in Lord of Rings. Qualcuno ha proposto di inserire lalfabeto Klingon
ma la proposta 竪 stata rifiutata perch辿 con lalfabeto latino si riesce benissimo
a scrivere in Klingon.
Implementazioni di Unicode
Lunghezza fissa: UTF-32 (32 bit)
 Vantaggio: ogni carattere occupa sempre lo stesso numero di byte.
Semplifica limplementazione dei text-editor e la divisione in pagine
 Svantaggio: incompatibile con i documenti ASCII pre-esistenti
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
Implementazioni di Unicode
Lunghezza variabile: UTF-8
1 1 0 x x x x x
1 1 1 0 x x x x
1 1 1 1 0 x x x
0 x x x x x x x => corrispondenza 1-a-1 con US-ASCII 7-bit
1 0 x x x x x x 1 0 x x x x x x 1 0 x x x x x x
1 0 x x x x x x 1 0 x x x x x x
1 0 x x x x x x
Replacement Character
Encoding
Perch息 l'encoding
即 importante?
Perch辿 辿 = U+00e9 (233 dec) = 11101001
(c3 a9)
Leggere in sequenza c3 a9 come se fosse ISO-8859-1
1 1 0 1 01 1 0 1 1 1 0 1 0 1 0 0 11 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1
Soluzioni locali: Extended ASCII (8-bit)
Non - printable
US ASCII (7-bit)
Extended
(c3 a9)
息
Missing glyph
Specificare
la codifica
(Notepad)
Specificare
la codifica
(Excel)
Specificare
la codifica
(Eclipse)
$ ls -l
total 16
-rw-r--r-- 1 francesco.francesco 433694780 147 Sep 14 11:34 example-1.csv
-rw-r--r-- 1 francesco.francesco 433694780 141 Sep 14 11:34 example-2.csv
$ file example-1.csv
example-1.csv: UTF-8 Unicode text
$ file example-2.csv
example-2.csv: ISO-8859 text
$ cat example-2.csv | iconv -f iso-8859-1 -t utf-8 > converted.csv
$ file converted.csv
converted.csv: UTF-8 Unicode text
Individuare la codifica e convertire (UNIX)
Una questione di ordine
Collation
Language Swedish: z < 旦
German: 旦 < z
Usage German Dictionary: of < 旦f
German Phonebook: 旦f < of
Customizations Upper-First A < a
Lower-First a < A
Riferimento: http://unicode.org/reports/tr10/
Alfabeto svedese: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Alfabeto tedesco: ABCDEFGHIJKLMNOPQRSTUVWXYZ (=A =O =U =ss)
Una questione di ordine
public void localeTest() {
final java.text.Collator collator1 = java.text.Collator.getInstance(java.util.Locale.forLanguageTag("TR"));
final java.text.Collator collator2 = java.text.Collator.getInstance(java.util.Locale.forLanguageTag("FR"));
collator1.setStrength(java.text.Collator.PRIMARY);
collator2.setStrength(java.text.Collator.PRIMARY);
System.out.println("----------------------------------------------------------------");
System.out.println(collator1.compare("o", "旦")); // -1 (TR)
System.out.println(collator2.compare("o", "旦")); // 0 (FR)
System.out.println(collator1.compare("脹", "i")); // -1 (TR)
System.out.println(collator2.compare("脹", "i")); // 1 (FR)
System.out.println(collator1.compare("I", "聴")); // -1 (TR)
System.out.println(collator2.compare("I", "聴")); // 0 (FR)
System.out.println("----------------------------------------------------------------");
}
Grazie per lattenzione

More Related Content

Encoding

  • 2. Perch辿 questo talk? Scambio di file CSV problematico Francesco;Via Torino;347-101212;1977-01-01 Filippo;Piazza Duomo;328-923212;1980-02-04 Luisa;Piazza Cordusio;02-123456;1979-03-12 Name,Address,Birthdate Francesco,Via Torino,1977-01-01 Filippo,Piazza Duomo,1980-02-04 Luisa,Piazza Cordusio,1979-03-12 Name,Address,Birthdate Ars竪ne,50 rue de Varenne,1977-01-01 Ad辿la誰de,134 rue du Fbg. St-Honor辿,1980-02-04 B辿n辿dicte,rue de la Paix,1979-03-12 Name,Address,Birthdate Ars?ne,50 rue de Varenne,1977-01-01 Ad?la?de,134 rue du Fbg. St-Honor?,1980-02-04 B?n?dicte,rue de la Paix,1979-03-12 Name,Address,Birthdate 亳仆舒,仍. 仂仆从舒,1977-01-01 仆亟亠亶,仂仗亠从 于亠仆舒亟从仂亞仂,1980-02-04 亳从仂亳,亠于从亳亶 仗仂仗亠从,1979-03-12 Name,Address,Birthdate ?????,??. ???????,1977-01-01 ??????,???????? ???????????,1980-02-04 ????????,??????? ????????,1979-03-12
  • 3. Il problema della codifica Stabilire una corrispondenza tra simboli e codici numerici (bytes) A=... B= C=... D=... E=... Quali sono i caratteri da rappresentare? IEC646 1972 ASCII 1968 PETSCII 1977 EBCDIC ~1960 0 1 1 0 1 0 0 1
  • 4. Standard: ASCII 7-bit (US-ASCII) 7 bit di codifica (+ 1 bit di parit): 128 combinazioni a..z A..Z 0..9 !"#$%&'()*+,-./:;<=>?@[]^_{|}~ 32 caratteri di controllo cosiddetti non-stampabili (CR, LF, backspace, ) Vantaggi Ordinamento alfabetico + numerico intrinseco 1 carattere 1 byte (per definizione) 0 x x x x x x x Problema Adatto solo alla lingua inglese Impossibile codificare accenti, dittonghi, dieresi e alfabeti non latini Es. in italiano si usava lapostrofo come workaround (e - perche - pero)
  • 5. Soluzioni locali: Extended ASCII (8-bit) Usare il vecchio bit di parit per raddoppiare le combinazioni (che diventano 256) Per diverse famiglie linguistiche esistono diverse varianti di Extended ASCII Le prime 127 combinazioni sono le stesse di US-ASCII, le altre dipendono da quale variante di Extended ASCII viene utilizzata Esempi: CODEPAGEs in MS-DOS x x x x x x x x
  • 6. Soluzioni locali: Extended ASCII (8-bit) Non - printable US ASCII (7-bit) Extended
  • 7. Soluzioni locali: Extended ASCII (8-bit) Non - printable US ASCII (7-bit) Extended
  • 8. Soluzioni locali: Extended ASCII (8-bit) Non - printable US ASCII (7-bit) Extended
  • 9. Soluzioni locali: Extended ASCII (8-bit) Superset di ISO-8859-1 (o latin1) Non - printable US ASCII (7-bit) Extended
  • 10. Globalizzazione e Unicode Necessit di scambiare informazioni fra parti diverse del mondo Necessit di usare pi湛 alfabeti nello stesso documento Name,Address,Birthdate 亳仆舒,仍. 仂仆从舒,1977-01-01 仆亟亠亶,仂仗亠从 于亠仆舒亟从仂亞仂,1980-02-04 Ars竪ne,50 rue de Varenne,1977-01-01 Ad辿la誰de,134 rue du Fbg. St-Honor辿,1980-02-04 B辿n辿dicte,rue de la Paix,1979-03-12 亳从仂亳,亠于从亳亶 仗仂仗亠从,1979-03-12
  • 11. Globalizzazione e Unicode Idea iniziale: usare 2 byte per carattere = 65536 combinazioni possibili 5 anni dopo la versione 1.0 si giungono ad assegnare 178500 combinazioni La versione 8.0 (2015) assegna 260319 combinazioni 2 byte non sono pi湛 sufficienti: Unicode 竪 una specifica da codificare a sua volta Curiosit: sono assegnati anche simboli di alfabeti appartenenti a lingue artificiali, come i Tengwar della lingua elfica creata da J.R.R Tolkien e parlata in Lord of Rings. Qualcuno ha proposto di inserire lalfabeto Klingon ma la proposta 竪 stata rifiutata perch辿 con lalfabeto latino si riesce benissimo a scrivere in Klingon.
  • 12. Implementazioni di Unicode Lunghezza fissa: UTF-32 (32 bit) Vantaggio: ogni carattere occupa sempre lo stesso numero di byte. Semplifica limplementazione dei text-editor e la divisione in pagine Svantaggio: incompatibile con i documenti ASCII pre-esistenti x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
  • 13. Implementazioni di Unicode Lunghezza variabile: UTF-8 1 1 0 x x x x x 1 1 1 0 x x x x 1 1 1 1 0 x x x 0 x x x x x x x => corrispondenza 1-a-1 con US-ASCII 7-bit 1 0 x x x x x x 1 0 x x x x x x 1 0 x x x x x x 1 0 x x x x x x 1 0 x x x x x x 1 0 x x x x x x
  • 16. Perch息 l'encoding 即 importante? Perch辿 辿 = U+00e9 (233 dec) = 11101001 (c3 a9) Leggere in sequenza c3 a9 come se fosse ISO-8859-1 1 1 0 1 01 1 0 1 1 1 0 1 0 1 0 0 11 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1
  • 17. Soluzioni locali: Extended ASCII (8-bit) Non - printable US ASCII (7-bit) Extended (c3 a9) 息
  • 22. $ ls -l total 16 -rw-r--r-- 1 francesco.francesco 433694780 147 Sep 14 11:34 example-1.csv -rw-r--r-- 1 francesco.francesco 433694780 141 Sep 14 11:34 example-2.csv $ file example-1.csv example-1.csv: UTF-8 Unicode text $ file example-2.csv example-2.csv: ISO-8859 text $ cat example-2.csv | iconv -f iso-8859-1 -t utf-8 > converted.csv $ file converted.csv converted.csv: UTF-8 Unicode text Individuare la codifica e convertire (UNIX)
  • 23. Una questione di ordine Collation Language Swedish: z < 旦 German: 旦 < z Usage German Dictionary: of < 旦f German Phonebook: 旦f < of Customizations Upper-First A < a Lower-First a < A Riferimento: http://unicode.org/reports/tr10/ Alfabeto svedese: ABCDEFGHIJKLMNOPQRSTUVWXYZ Alfabeto tedesco: ABCDEFGHIJKLMNOPQRSTUVWXYZ (=A =O =U =ss)
  • 24. Una questione di ordine public void localeTest() { final java.text.Collator collator1 = java.text.Collator.getInstance(java.util.Locale.forLanguageTag("TR")); final java.text.Collator collator2 = java.text.Collator.getInstance(java.util.Locale.forLanguageTag("FR")); collator1.setStrength(java.text.Collator.PRIMARY); collator2.setStrength(java.text.Collator.PRIMARY); System.out.println("----------------------------------------------------------------"); System.out.println(collator1.compare("o", "旦")); // -1 (TR) System.out.println(collator2.compare("o", "旦")); // 0 (FR) System.out.println(collator1.compare("脹", "i")); // -1 (TR) System.out.println(collator2.compare("脹", "i")); // 1 (FR) System.out.println(collator1.compare("I", "聴")); // -1 (TR) System.out.println(collator2.compare("I", "聴")); // 0 (FR) System.out.println("----------------------------------------------------------------"); }