Manpages

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 «\[u00BB] 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)