CHARSETS(4) Manuel du programmeur Linux CHARSETS(4)
NOM
charsets - Jeux de caractères et internationalisation pour
les programmeurs.
DESCRIPTION
Linux est un système d'exploitation international.
Plusieurs de ses utilitaires et de ses gestionnaires de
périphériques (y compris le gestionnaire de console) sup
portent les jeux de caractères 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'Hébreu.
Cette page de manuel présente le point de vue du program
meur sur les différents jeux de caractères, et comment ils
s'organisent sous Linux. Les standards présentés compren
nent 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 caractères 7-bits original, prévu pour l'anglais
(américain). Il est décrit actuellement dans le standard
ECMA-6.
Une variante ASCII remplaçant le symbole americain "dièse"
par le symbole anglais "livre sterling" est utilisé en
Grande Bretagne. Si besoin, on identifie les variantes
américaines et britanniques en utilisant les termes "ASCII
US" et "ASCII UK".
Comme Linux est écrit sur du matériel conçu pour les
Etats-Unis, il supporte l'ASCII US de manière native.
ISO 8859
L'ISO 8859 est une série de 10 jeux de caractères 8 bits,
contenant l'ASCII US dans leur première moitie (7 bits),
des caractères de contrôle non-imprimables entre les posi
tions 128 et 159, et 96 symboles graphiques de largeur
fixe aux emplacements 160 à 255.
De tous ces jeux, le plus important ([NDT] notamment pour
nous !) est l'ISO 8859-1 (Latin-1). Il est supporte de
manière native par le gestionnaire de console Linux, assez
bien supporté par X11R6, et c'est le jeu de caractères de
base pour l'HTML.
Le support console des autres jeux de caractères 8859 est
disponible sous Linux, à travers des utilitaires comme
setfont(8), qui modifient la correspondance des touches du
clavier, la table graphique EGA, et utilisent une projec
tion personnalisée de la table de fonte du gestionnaire de
Linux 15 Septembre 1998 1
CHARSETS(4) Manuel du programmeur Linux CHARSETS(4)
console.
Voici une brève description des jeux de caractères 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 Français, le Gal
lois, le Hollandais, l'Irlandais, l'Islandais,
l'Italien, le Norvégien, le Portugais et le
Suédois. Le manque de liaison entre les "ij" hol
landais, entre les "oe" français, et l'absence des
anciens guillemets ,,Allemands`` est tolérable.
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, Slo
vaque, Slovénien, et Tchèque.
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 obsolète, remplacé
par 8859-10 (Latin-6).
8859-5 L'alphabet ciryllique est utilisé en Bulgare,
Biélorusse, Macedonien, Russe, Serbe et Ukrainien.
Les ukrainiens prononcent la lettre `ghe' fermée,
comme `heh' et aurait besoin d'un accent pour dis
tinguer le `ghe' correct. Voir les remarques con
cernant le KOI8-R ci-dessous.
8859-6 Supporte l'Arabe. La table 8859-6 est une fonte de
caractères de largeurs fixes, mais un affichage
correct doit combiner les lettres en utilisant
leurs formes initiale, centrale et finale.
8859-7 Supporte le grec moderne.
8859-8 Supporte l'Hébreu.
8859-9 (Latin-5)
Il s'agit d'une variante du Latin-1 qui remplace
les lettres Islandaises rarement utilisées par des
lettres Turques.
8859-10 (Latin-6)
Le Latin 6 ajoute les dernières lettres Inuit
(Groenland) et Sami (Lappon) qui manquaient dans le
Linux 15 Septembre 1998 2
CHARSETS(4) Manuel du programmeur Linux CHARSETS(4)
Latin 4 pour couvrir toute la zone nordique. La
RFC 1345 indique un latin 6 plus ancien et
différent. Le Sami nécessite en réalite plus
d'accents que ceux proposés.
KOI8-R
Le KOI8-R est un jeu de caractères non-ISO très répandu en
Russie. La première moitié correspond a l'ASCII US, la
seconde est un jeu de caractère cyrillique un peu mieux
conçu que l'ISO 8859-5.
Le support console du KOI8-R est disponible sous Linux, à
travers des utilitaires comme setfont(8), qui modifient la
correspondance des touches du clavier, la table graphique
EGA, et utilisent une projection personnalisée de la table
de fonte du gestionnaire de console.
UNICODE
L'Unicode (ISO 10646) est un standard destiné à représen
ter sans ambiguïté tous les signes écrits de toutes les
langues humaines connues. L'encodage natif Unicode est
sur 32 bits (des versions plus anciennes étaient sur 16
bits). Des informations supplémentaires sur l'Unicode sont
disponibles sur <http://www.unicode.com>.
Linux représente l'Unicode en utilisant le format de tran
fert sur 8 bits (UTF-8). L'UTF-8 est un codage à 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.
Représentons par 0,1,x des bits à 0, a 1, ou quelconque.
Un octet 0xxxxxxx correspond à l'Unicode 00000000 0xxxxxxx
qui indique le même symbole que l'ASCII 0xxxxxxx. Ainsi,
ASCII n'est pas modifié 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 représente le début d'un code sur
2-octets code, et 110xxxxx 10yyyyyy est assemblé en
00000xxx xxyyyyyy. Un octet 1110xxxx correspond au début
d'un code sur 3 octets, et 1110xxxx 10yyyyyy 10zzzzzz sont
assemblés en xxxxyyyy yyzzzzzz. (Quand l'UTF-8 est
utilisé pour coder les 31 bits de l'ISO 10646 cette pro
gression continue jusqu'à des codes sur 6 octets.)
Pour les utilisateurs de l'ISO-8859-1, ceci signifie que
les caractères avec le bit de poids fort à 1 sont désor
mais codés sur deux octets. Ceci tend à allonger les
fichiers de texte ordinaires de 1 a 2 pour cent ([NDT]
Dans quel langue ? Il y a plus d'un à deux pour cent de
caractères accentués en français !). Il n'y a pas de
problèmes de conversion néanmoins, car les symboles Uni
code correspondant aux caractères ISO-8859-1 conservent
Linux 15 Septembre 1998 3
CHARSETS(4) Manuel du programmeur Linux CHARSETS(4)
les mêmes valeurs (étendues avec 8 bits à zéro en tete).
Pour les utilisateurs japonais, ceci signifie que les
codes sur 16 bits courrament employés prendront désormais
3 octets, et que les tables de transcodage devront être
étendues. D'ailleurs de nombreux japonais préfèrent 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 début de code. Notez également que les
octets ASCII dans un flux UTF-8 ne peuvent que représenter
les caractères ASCII correspondants. En particulier il n'y
a pas de caractères NULs ou '/' pour introduire un code
étendu.
Comme l'ASCII, et en particulier NUL et '/', ne sont pas
modifiés, le noyau ne remarque pas que l'UTF-8 est
utilisé. Il n'a pas à se préoccuper de la signification
des octets qu'il manipule.
La gestion des flux de données Unicode est généralement
effectuée à travers des tables de "sous-fontes" correspon
dant à un sous-ensemble des caractères Unicode. En
interne, le noyau utilise l'Unicode pour décrire les sous-
fontes chargées en mémoire vidéo. Ce signifie qu'en mode
UTF-8, on peut utiliser le jeu de caractères japonais avec
512 symboles différents. Ce n'est pas assez pour le Japon
ais, le Chinois ou le Coréen, mais c'est generalement
suffisant pour toutes les autres utilisations.
ISO 2022 et ISO 4873
Les standards ISO 2022 et 4873 décrivent un modèle de
contrôle des fontes basé sur le fonctionnement du VT100.
Ce modèle est (partiellement) supporté par le noyau Linux
et xterm(1). Il est assez populaire au Japon et en Corée.
Il existe 4 jeux de caractères graphiques, nommés G0, G1,
G2 et G3, l'un d'entre eux est utilisé comme jeu de car
actères en cours pour les codes avec le bit de poids fort
à 0 (par défaut G0), et un autre est utilisé pour les
codes avec le bit de poids fort à 1 (initialement G1).
Chaque ensemble dispose de 94 ou 96 caractères, et est
constitué de caractères sur 7 bits. Ce modèle utilise soit
les codes 040-0177 (041-0176) soit les codes 0240-0377
(0241-0376). G0 a toujours une taille de 94 caractères et
utilise les codes 041-0176.
Le basculement entre les jeux de caractères est effectué à
travers les séquences ^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
réclame le jeu Gn pour les codes dont le bit de poids fort
est à zéro. La fonction Sn demande le jeu Gn pour les
Linux 15 Septembre 1998 4
CHARSETS(4) Manuel du programmeur Linux CHARSETS(4)
codes dont le bit de poids fort est à un. La fonction SSn
réclame le jeu Gn (n=2 ou 3) pour le caractère suivant
uniquement (quelque soit la valeur du bit de poids fort).
Un jeu de 94 caractères est désigné comme jeu Gn par une
séquence ESC ( xx (pour G0), ESC ) xx (pour G1), ESC * xx
(pour G2), ESC + xx (pour G3), où xx est un symbole, ou
une paire de symboles du standard ISO 2375 International
Register of Coded Character Sets. Par exemple, ESC ( @
sélectionne le jeu ISO 646 en tant que G0, ESC ( A selec
tionné le jeu standard UK (avec la livre sterling à la
place du dièse), ESC ( B sélectionne l'ASCII, ESC ( M
sélectionne un jeu de caractères Africains, ESC ( ! A
sélectionne les caractères Cubains, etc...
Un jeu de 96 caractères est désigné comme jeu Gn par une
séquence ESC - xx (pour G1), ESC . xx (pour G2) ou ESC /
xx (pour G3). Par exemple, ESC - G sélectionne l'alphabet
Hebreu comme G1.
Un jeu de caractères multi-octets est désigné comme jeu Gn
par une séquence ESC $ xx ou ESC $ ( xx (pour G0), ESC $ )
xx (pour G1), ESC $ * xx (pour G2), ESC $ + xx (pour G3).
Par exemple, ESC $ ( C sélectionne les caractères Coréens
pour le jeu G0. Le jeu de caractères Japonais sélectionné
par ESC $ B dispose d'une version plus récente sélec
tionnée par ESC & @ ESC $ B.
L'ISO 4873 réclame une utilisation précise des jeux de
caractères, dans laquelle G0 est fixé (toujours l'ASCII),
ainsi seuls G1, G2 et G3 peuvent être invoqués pour les
codes avec un bit de poids fort à 1. En particulier, ^N
et ^O ne sont plus utilisés, ESC ( xx peut seulement être
utilisé avec xx=B, et ESC ) xx, ESC * xx, ESC + xx sont
équivalents à ESC - xx, ESC . xx, ESC / xx, respective
ment.
VOIR AUSSI
console(4), console_ioctl(4), console_codes(4), ascii(7),
iso_8859_1(7), unicode(7), utf-8(7).
TRADUCTION
Christophe Blaess, 1997.
Linux 15 Septembre 1998 5