Provided by:
manpages-it_0.3.4-5_all 
NOME
charsets - il punto di vista del programmatore sugli insiemi di
caratteri e sull’internazionalizzazione
DESCRIZIONE
Linux è un sistema operativo internazionale. Molte delle sue utilità e
device driver (incluso il driver di console) supportano insiemi di
caratteri multilinguistici, come le lettere dell’alfabeto latino con
segni diacritici, accenti, logotipi (ligature, in inglese), e interi
alfabeti non latini compresi quello greco, cirillico, arabico ed
ebraico.
Questa pagina di manuale presenta il punto di vista di un programmatore
sui diversi standard per gli insiemi di caratteri e su come
interagiscono in Linux. Gli standard discussi includono ASCII, ISO
8859, KOI8-R, Unicode, ISO 2022 e ISO 4873.
ASCII
ASCII (American standard code for information: Codice standard
americano per l’informazione) è l’insieme di caratteri originale a 7
bit, creato in origine per l’inglese americano. Viene ora descritto
dallo standard ECMA-6.
Una variante di ASCII che sostituisce il cancelletto «#» col simbolo
della sterlina inglese è usata in Gran Bretagna; se necessario, le
varianti americane e britanniche possono essere distinte come «US
ASCII» e «UK ASCII».
Essendo Linux stato scritto per hardware progettato negli USA, supporta
nativamente lo US ASCII.
ISO 8859
ISO 8859 è una serie di dieci insiemi di caratteri a 8 bit che
contengono US ASCII nella metà bassa (quella a 7 bit), caratteri
invisibili di controllo nelle posizioni da 128 a 159, e novantasei
grafici a larghezza fissa nelle posizioni da 160 a 255.
Di questi, il più importante è ISO 8859-1 (Latin-1). È supportato
nativamente dal driver di console di Linux, abbastanza bene da X11R6,
ed è l’insieme base di caratteri di HTML.
Il supporto di console per gli altri insiemi di carattere ISO 8859 è
disponibile in Linux grazie a utilità in modo utente (come setfont(8))
che modificano le associazioni di tastiera e la tabella grafica EGA, e
impiegano una «mappa utente» per la tabella di caratteri nel driver di
console.
Ecco una breve descrizione di ciascun insieme:
8859-1 (Latin-1)
Latin-1 copre la maggior parte delle lingue europee occidentali,
come albanese, catalano, danese, faroese, finlandese, francese,
galiziano, inglese, irlandese, islandese, italiano, norvegese,
olandese, portoghese, spagnolo, svedese e tedesco. La mancanza
dei logotipi oe (francese), ij (olandese) e virgolette ,,vecchio
stile‘‘ (tedesco) è tollerabile. 8859-2 (Latin-2) Latin-2
supporta molte lingue slave e centro-europee a caratteri latini:
ceco, croato, polacco, rumeno, slovacco, sloveno, tedesco e
ungherese.
8859-3 (Latin-3)
Latin-3 è popolare con gli autori di esperanto, galiziano,
maltese e turco.
8859-4 (Latin-4)
Latin-4 introduce lettere per estone, lettone e lituano. È
essenzialmente obsoleto; vedi 8859-10 (Latin-6).
8859-5 Lettere cirilliche per bulgaro, bellorusso, macedone, russo,
serbo e ucraino. Gli ucraini leggono la lettera «ghe» con
trattino in basso come «heh» e avrebbero bisogno di una ghe con
trattino in alto per scrivere la ghe giusta. Vedi anche oltre la
discussione su KOI8-R.
8859-6 Supporta l’arabico. La tabella 8859-6 di glifi contiene un
insieme di caratteri con lettere distinte, ma il motore di
visualizzazione (display engine) dovrebbe combinarli usando le
appropriate forme iniziali, mediane e finali.
8859-7 Supporta il greco moderno.
8859-8 Supporta l’ebraico.
8859-9 (Latin-5)
Questa è una variante di Latin-1 che sostituisce le lettere
islandesi, di utilizzo raro, con quelle turche.
8859-10 (Latin-6)
Latin 6 aggiunge le lettere inuit (groenlandese) e sami
(lappone) mancanti in Latin-4, così da coprire l’intera area
nordica. RFC 1345 elencava una versione preliminare, e
differente. Il sami skolt abbisogna di alcuni ulteriori accenti.
8859-13 (Latin-7)
8859-14 (Latin-8)
8859-15
Questo aggiunge il segno dell’Euro e alcuni logotipi francesi
assenti in Latin-1.
KOI8-R
KOI8-R è un insieme di caratteri non ISO ma molto diffuso in Russia. La
metà bassa è US ASCII; la metà alta contiene un insieme di caratteri
cirillici, concepito vagamente meglio di quello di ISO 8859-5.
Il supporto di console per KOI8-R è disponibile in Linux grazie a
utilità in modo utente che modificano le associazioni di tastiera e la
tabella grafica EGA, e impiegano una «mappa utente» per la tabella di
caratteri nel driver di console.
UNICODE
Unicode (ISO 10646) è uno standard il cui scopo è rappresentare senza
ambiguità ogni glifo di ogni lingua umana. La codifica innata di
Unicode è a 32 bit (versioni precedenti usavano 16 bit). Informazioni
su Unicode sono disponibili a <http://www.unicode.com>.
Linux rappresenta Unicode tramite il «Formato di trasferimento Unicode»
(Unicode Transfer Format) a 8 bit (UTF-8). UTF-8 è una codifica di
Unicode a lunghezza variabile. Utilizza un byte per codificare 7 bit,
due byte per 11 bit, tre byte per 16 bit, quattro per 21 bit, cinque
per 26 e sei per 31.
Scriviamo 0,1,x per un bit zero, uno o arbitrario. Un byte 0xxxxxxx
rappresenta l’Unicode 00000000 0xxxxxxx, che codifica lo stesso simbolo
dell’ASCII 0xxxxxxx. Perciò, ASCII rimane invariato in UTF-8 e coloro
che usano solo ASCII non notano nessuna differenza: né nel codice, né
nella dimensione del file.
Un byte 110xxxxx è l’inizio di una codifica a due byte, dove 110xxxxx
10yyyyyy sta per 00000xxx xxyyyyyy. Un byte 1110xxxx è l’inizio di una
codifica a tre byte, dove 1110xxxx 10yyyyyy 10zzzzzz sta per xxxxyyyy
yyzzzzzz. Se si usa UTF-8 per codificare l’ISO 10646 a 31 bit, la
progressione continua fino alle codifiche a 31 bit.
Per gli utilizzatori di ISO-8859-1, questo significa che i caratteri in
cui il bit più alto è impostato hanno ora bisogno di due byte. Ciò
tende ad espandere un file ordinario di testo dell’uno o due per cento.
Non ci sono problemi di conversione, però, avendo i simboli ISO-8859-1
lo stesso valore in Unicode (estesi da otto bit nulli in fronte). Per
gli utenti giapponesi, questo significa che i codici a 16 bit
comunemente usati hanno bisogno di tre byte e che grosse tabelle di
traduzione sono necessarie: di conseguenza, molti utenti giapponesi
preferiscono ISO 2022.
Si noti che UTF-8 è autosincronizzante: 10xxxxxx è una coda, e
qualsiasi altro byte è la testa di un codice. Si noti anche che l’unico
modo in cui un byte ASCII può comparire in una sequenza UTF-8 è come se
stesso. In particolare, non ci sono byte NULli o «/» che formano una
parte di un codice più lungo.
Poiché ASCII, e, in particolare, NUL e «» sono invariati, il kernel non
si rende conto dell’utilizzo di UTF-8. Non gl’interessa il significato
dei byte di cui si occupa.
Le sequenze di dati Unicode sono solitamente rese attraverso tabelle
che associano sottoinsiemi di Unicode a glifi. Internamente, il kernel
usa Unicode per descrivere il sottoinsieme caricato nella RAM video.
Ciò significa che in modo UTF-8 si può usare un insieme di caratteri
con soli 512 simboli diversi. Questo non è sufficiente per giapponese,
cinese o coreano, ma basta per la maggior parte degli altri utilizzi.
ISO 2022 e ISO 4873
Gli standard ISO 2022 e 4873 descrivono un modello di controllo dei
caratteri basato sugli usi di VT100. Questo modello è (parzialmente)
supportato dal kernel di Linux e da xterm(1). È molto popolare in
Giappone e Corea.
Ci sono quattro insiemi di caratteri grafici, chiamati G0, G1, G2 e G3:
uno di loro è l’insieme corrente per i codici con bit più alto zero
(all’inizio G0), e uno di loro è l’insieme corrente per i codici con
bit più alto uno (all’inizio G1). Ciascun insieme di caratteri grafici
ha 94 o 96 caratteri ed è essenzialmente un insieme a sette bit. Usa i
codici 040-0177 (041-0176) oppure 0240-0377 (0241-0376). G0 ha sempre
94 elementi e usa i codici 041-0176.
Si passa da un insieme all’altro attraverso le funzioni di cambiamento
di stato ^N (SO oppure LS1), ^O (SI oppure LS0), ESC n (LS2), ESC o
(LS3), ESC N (SS2), ESC O (SS3), ESC ~ (LS1R), ESC } (LS2R), ESC |
(LS3R). La funzione LSn fa sì che l’insieme Gn sia quello corrente per
codici con bit più alto zero. La funzione LSnR fa sì che l’insieme Gn
sia quello corrente per codici con bit più alto uno. La funzione SSn
fa sì che l’insieme Gn (n=2 oppure 3) sia quello corrente per il solo
carattere successivo (qualsiasi sia il valore del suo bit più alto).
Un insieme da 94 caratteri viene denotato come l’insieme Gn da una
sequenza ESC ( xx (per G0), ESC ) xx (per G1), ESC * xx (per G2), ESC +
xx (per G3), dove xx è un simbolo o una coppia di simboli trovati in
ISO 2375 International Register of Coded Character Sets. Per esempio,
ESC ( @ seleziona l’insieme di caratteri ISO 646 come G0, ESC ( A
seleziona l’insieme standard britannico (con la sterlina al posto del
cancelletto), ESC ( B seleziona l’ASCII (col dollaro al posto del
simbolo monetario), ESC ( M seleziona un insieme di caratteri per le
lingue africane, ESC ( ! A seleziona l’insieme cubano, ecc. ecc.
Un insieme da 96 caratteri viene denotato come l’insieme Gn da una
sequenza ESC - xx (per G1), ESC . xx (per G2), ESC / xx (per G3). Per
esempio, ESC - G seleziona l’alfabeto ebraico come G1.
Un insieme multi-byte viene denotato come l’insieme Gn da una sequenza
ESC $ xx oppure ESC $ ( xx (per G0), ESC $ ) xx (per G1), ESC $ * xx
(per G2), ESC $ + xx (per G3). Per esempio, ESC $ ( C seleziona
l’insieme di caratteri coreano come G0. L’insieme giapponese
selezionato da ESC $ B ha una versione più recente selezionata da ESC &
@ ESC $ B.
ISO 4873 stabilisce un uso più restrittivo degli insiemi, in cui G0 è
fissato (sempre ASCII), facendo sì che G1, G2 e G3 possano essere
invocati per codici in cui il bit più alto è impostato. In particolare,
^N e ^O non vengono più usati, ESC ( xx può essere usato solo con xx=B,
e ESC ) xx, ESC * xx, ESC + xx sono equivalenti, rispettivamente, a ESC
- xx, ESC . xx, ESC / xx.
VEDERE ANCHE
console(4), console_ioctl(4), console_codes(4), ascii(7),
iso_8859_1(7), unicode(7), utf-8(7)