CHARSETS(4)

NOM
charsets - Jeux de caracteres et internationalisation pour les programmeurs.

DESCRIPTION
Linux est un systeme d'exploitation international. Plusieurs de ses utilitaires et de ses gestionnaires de peripheriques (y compris le gestionnaire de console) supportent les jeux de caracteres multilingues contenant les lettres de l'alphabet Latin avec des accents et des liaisons, et des alphabets non-Latin complets comme le Grec, le Cyrillique, l'Arabe ou l'Hebreu.

Cette page de manuel presente le point de vue du programmeur sur les differents jeux de caracteres, et comment ils s'organisent sous Linux. Les standards presentes comprennent l'ASCII, l'ISO 8859, le KOI8-R, l'Unicode, l'ISO 2022 et l'ISO 4873.

ASCII
L'ASCII (American Standard Code For Information) est le jeu de caracteres 7-bits original, prevu pour l'anglais (americain). Il est decrit actuellement dans le standard ECMA-6.

Une variante ASCII remplacant le symbole americain "diese" par le symbole anglais "livre sterling" est utilise en Grande Bretagne. Si besoin, on identifie les variantes americaines et britanniques en utilisant les termes "ASCII US" et "ASCII UK".

Comme Linux est ecrit sur du materiel concu pour les Etats-Unis, il supporte l'ASCII US de maniere native.

ISO 8859
L'ISO 8859 est une serie de 10 jeux de caracteres 8 bits, contenant l'ASCII US dans leur premiere moitie (7 bits), des caracteres de controle non-imprimables entre les positions 128 et 159, et 96 symboles graphiques de largeur fixe aux emplacements 160 a 255.

De tous ces jeux, le plus important ([NDT] notamment pour nous !) est l'ISO 8859-1 (Latin-1). Il est supporte de maniere native par le gestionnaire de console Linux, assez bien supporte par X11R6, et c'est le jeu de caracteres de base pour l'HTML.

Le support console des autres jeux de caracteres 8859 est disponible sous Linux, a travers des utilitaires comme setfont(8), qui modifient la correspondance des touches du clavier, la table graphique EGA, et utilisent une projection personnalisee de la table de fonte du gestionnaire de console.

Voici une breve description des jeux de caracteres 8859 :

8859-1 (Latin-1)
    Le Latin-1 couvre la plupart des langues d'Europe de l'Ouest, comme l'Albanais, l'Allemand, l'Anglais, le Catalan, le Danois, l'Espagnol, le Faroese [NDT ???], le Finnois, le Francais, le Gallois, le Hollandais, l'Irlandais, l'Islandais, l'Italien, le Norvegien, le Portugais et le Suedois. Le manque de liaison entre les "ij" hollandais, entre les "oe" francais, et l'absence des anciens guillemets ,,Allemands`` est tolerable.

8859-2 (Latin-2)
    Le Latin-2 contient la plupart des langues slaves d'Europe de l'Est utilisant l'alphabet Latin : Allemand, Croate, Hongrois, Polonais, Roumain, Slovaque, Slovenien, et Tcheque.

8859-3 (Latin-3)
    Le Latin-3 est utilise pour les textes en Esperanto, Galois, Maltais, et Turc.

8859-4 (Latin-4)
    Le Latin-4 introduit des lettres pour l'Estonien et le Lithuanien. Il est presque obsolete, remplace par 8859-10 (Latin-6).

8859-5
    L'alphabet ciryllique est utilise en Bulgare, Bielorusse, Macedonien, Russe, Serbe et Ukrainien. Les ukrainiens prononcent la lettre `ghe' fermee, comme `heh' et aurait besoin d'un accent pour distinguer le `ghe' correct. Voir les remarques concernant le KOI8-R ci-dessous.

8859-6
    Supporte l'Arabe. La table 8859-6 est une fonte de caracteres de largeurs fixes, mais un affichage correcte doit combiner les lettres en forme intiale, centrale et finale.

8859-7
    Supporte le grec moderne.

8859-8
    Supporte l'Hebreu.

8859-9 (Latin-5)
    Il s'agit d'une variante du Latin-1 qui remplace les lettres Islandaises rarement utilisees par des lettres Turques.

8859-10 (Latin-6)
    Le Latin 6 ajoute les dernieres lettres Inuit (Groenland) et Sami (Lappon) qui manquaient dans le Latin 4 pour couvrir toute la zone nordique. La RFC 1345 indique un latin6 plus ancien et different. Le Sami necessite en realite plus d'accents que ceux proposes.

KOI8-R
Le KOI8-R est un jeu de caracteres non-ISO tres repandu en Russie. La premiere moitie correspond a l'ASCII US, la seconde est un jeu de caractere cyrillique un peu mieux concu que l'ISO 8859-5.

Le support console du KOI8-R est disponible sous Linux, a travers des utilitaires comme setfont(8), qui modifient la correspondance des touches du clavier, la table graphique EGA, et utilisent une projection personnalisee de la table de fonte du gestionnaire de console.

UNICODE
L'Unicode (ISO 10646) est un standard destine a representer sans ambiguite tous les signes ecrits de toutes les langues humaines connues. L'encodage natif Unicode est sur 32 bits (des versions plus anciennes etaient sur 16 bits). Des informations supplementaires sur l'Unicode sont disponibles sur <http://www.unicode.com>.

Linux represente l'Unicode en utilisant le format de tranfert sur 8 bits (UTF-8). L'UTF-8 est un codage a longueur variable. Il utilise un octet pour coder 7 bits, 2 octets pour 11 bits, 3 octets pour 16 bits, 4 octets pour 21 bits, 5 octets pour 26 bits, 6 octets pour 31 bits.

Representons par 0,1,x des bits a 0, a 1, ou quelconque. Un octet 0xxxxxxx correspond a l'Unicode 00000000 0xxxxxxx qui indique le meme symbole que l'ASCII 0xxxxxxx. Ainsi, ASCII n'est pas modifie par UTF-8, et les gens utilisant uniquement l'ASCII ne remarqueront aucun changement : ni dans le codage, ni dans les tailles de fichiers.

Un octet 110xxxxx represente le debut d'un code sur 2-octets code, et 110xxxxx 10yyyyyy est assemble en 00000xxx xxyyyyyy. Un octet 1110xxxx correspond au debut d'un code sur 3 octets, et 1110xxxx 10yyyyyy 10zzzzzz sont assembles en xxxxyyyy yyzzzzzz. (Quand l'UTF-8 est utilise pour coder les 31 bits de l'ISO 10646 cette progression continue jusqu'a des codes sur 6 octets.)

Pour les utilisateurs de l'ISO-8859-1, ceci signifie que les caracteres avec le bit de poids fort a 1 sont desormais codes sur deux octets. Ceci tend a allonger les fichiers de texte ordinaires de 1 a 2 pour cent ([NDT] Dans quel langue ? Il y a plus d'un a deux pour cent de caracteres accentues en francais !). Il n'y a pas de problemes de conversion neanmoins, car les symboles Unicode correspondant aux caracteres ISO-8859-1 conservent les memes valeurs (etendues avec 8 bits a zeros en tete). Pour les utilisateurs japonais, ceci signifie que les codes sur 16 bits courrament employes prendront desormais 3 octets, et que les tables de transcodage devront etre etendues. D'ailleurs de nombreux japonais preferent le standard ISO 2022.

Remarquez que l'UTF-8 se synchronise automatiquement : 10xxxxxx est le corps ou la fin d'un code, et tout autre octet est un debut de code. Notez egalement que les octets ASCII dans un flux UTF-8 ne peuvent que representer les caracteres ASCII correspondants. En particulier il n'y a pas de caracteres NULs ou '/' pour introduire un code etendu.

Comme l'ASCII, et en particulier NUL et '/', ne sont pas modifies, le noyau ne remarque pas que l'UTF-8 est utilise. Il n'a pas a se preoccuper de la signification des octets qu'il manipule.

La gestion des flux de donnees Unicode est generalement effectuee a travers des tables de "sous-fontes" correspondant a un sous-ensemble des caracteres Unicode. En interne, le noyau utilise l'Unicode pour decrire les sous-fontes chargees en memoire video. Ce signifie qu'en mode UTF-8, on peut utiliser le jeu de caracteres japonais avec 512 symboles differents. Ce n'est pas assez pour le Japonais, le Chinois ou le Coreen, mais c'est generalement suffisant pour toutes les autres utilisations.

ISO 2022 et ISO 4873
Les standards ISO 2022 et 4873 decrivent un modele de controle des fontes base sur le fonctionnement du VT100. Ce modele est (partiellement) supporte par le noyau Linux et xterm(1). Il est assez populaire a Japon et en Coree.

Il existe 4 jeux de caracteres graphiques, nommes G0, G1, G2 et G3, l'un d'entre eux est utilises comme jeu de caracteres en cours pour les codes avec le bit de poids fort a 0 (par defaut G0), et un autre est utilise pour les codes avec le bit de poids fort a 1 (initialement G1). Chaque ensemble dispose de 94 ou 96 caracteres, et est constitue de caracteres sur 7 bits. Ce modele utilise soit les codes 040-0177 (041-0176) soit les codes 0240-0377 (0241-0376). G0 a toujours une taille de 94 caracteres et utilise les codes 041-0176.

Le basculement entre les jeux de caracteres est effectue a travers les sequences ^N (SO ou LS1), ^O (SI ou LS0), ESC n (LS2), ESC o (LS3), ESC N (SS2), ESC O (SS3), ESC ~ (LS1R), ESC } (LS2R), ESC | (LS3R). La fonction LSn reclame le jeu Gn pour les codes dont le bit de poids fort est a zero. La fonction Sn demande le jeu Gn pour les codes dont le bit de poids fort est a un. La fonction SSn reclame le jeu Gn (n=2 ou 3) pour le caractere suivant uniquement (quelque soit la valeur du bit de poids fort).

Un jeu de 94 caracteres est designe comme jeu Gn par une sequence ESC ( xx (pour G0), ESC ) xx (pour G1), ESC * xx (pour G2), ESC + xx (pour G3), ou xx est un symbole, ou une paire de symboles du standard ISO 2375 International Register of Coded Character Sets. Par exemple, ESC ( @ selectionne le jeu ISO 646 en tant que G0, ESC ( A selectionne le jeu standard UK (avec la livre sterling a la place du diese), ESC ( B selectionne l'ASCII, ESC ( M selectionne un jeu de caracteres Africains, ESC ( ! A selectionne les caracteres Cubains, etc...

Un jeu de 96 caracteres est designe comme jeu Gn par une sequence ESC - xx (pour G1), ESC . xx (pour G2) ou ESC / xx (pour G3). Par exemple, ESC - G selectionne l'alphabet Hebreu comme G1.

Un jeu de caracteres multi-octets est designe comme jeu Gn par une sequence ESC $ xx ou ESC $ ( xx (pour G0), ESC $ ) xx (pour G1), ESC $ * xx (pour G2), ESC $ + xx (pour G3). Par exemple, ESC $ ( C selectionne les caracteres Coreens pour le jeu G0. Le jeu de caracteres Japonais selectionne par ESC $ B dispose d'une version plus recente selectionnee par ESC & @ ESC $ B.

L'ISO 4873 reclame une utilisation precise des jeux de caracteres, dans laquelle G0 est fixe (toujours l'ASCII), ainsi seuls G1, G2 et G3 peuvent etre invoques pour les codes avec un bit de poids fort a 1. En particulier, ^N et ^O ne sont plus utilises, ESC ( xx peut seulement etre utilise avec xx=B, et ESC ) xx, ESC * xx, ESC + xx sont equivalents a ESC - xx, ESC . xx, ESC / xx, respectivement.

VOIR AUSSI
console(4), console_ioctl(4), console_codes(4), ascii(7), iso_8859_1(7), unicode(7), utf-8(7).