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) prennent en charge les jeux de caractères
multilingues contenant les lettres de l'alphabet latin avec des accents et des
ligatures, 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 programmeur sur les
différents jeux de caractères, et comment ils s'organisent sous
Linux. Les normes présentées sont l'ASCII, l'ISO 8859, le
KOI8-R, l'Unicode, l'ISO 2022 et l'ISO 4873. Un accent particulier
est mis sur les jeux de caractères véritablement utilisés dans
les paramètres régionaux, et non sur la myriade de jeux de
caractères provenant d'autres systèmes.
Une liste complète des jeux de caractères utilisés dans les
paramètres régionaux officiels de la glibc est :
ISO-8859-{1,2,3,5,6,7,8,9,13,15}, CP1251, UTF-8, EUC-{KR,JP,TW}, KOI8-{R,U},
GB2312, GB18030, GBK, BIG5, BIG5-HKSCS et TIS-620, sans ordre particulier. Le
roumain a basculé vers ISO-8859-16.
ASCII¶
L'ASCII (American Standard Code For Information Interchange) est le jeu de
caractères 7 bits original, prévu pour l'anglais
(américain). Il est décrit actuellement dans la norme ECMA-6.
Différentes variantes d'ASCII existent, qui remplacent le dollar par
d'autres symboles monétaires et la ponctuation par des caractères
accentués pour couvrir l'allemand, le français, l'espagnol et
d'autres langues en 7 bits. Elles sont toutes obsolètes, la glibc ne
gère que les paramètres régionaux dont le jeu de
caractères est un surensemble d'ASCII (ces jeux de caractères sont
aussi appelés ISO-646, un cousin proche d'ASCII qui a permis de remplacer
ces caractères).
Comme Linux est écrit pour du matériel conçu aux États-Unis,
il prend en charge l'ASCII 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 moitié
(7 bits), des caractères de contrôle non imprimables entre les
positions 128 et 159, et 96 symboles graphiques de largeur fixe aux
emplacements 160 à 255.
De tous ces jeux, le plus important est l'ISO 8859-1 (latin-1). Il est pris
en charge de manière native par le gestionnaire de console Linux, assez
bien pris en charge par X11R6, et c'est le jeu de caractères de base pour
l'HTML.
La prise en charge 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 projection personnalisée de la police du
gestionnaire de 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 férovingien, le finnois, le français, le gallois,
le néerlandais, l'irlandais, l'islandais, l'italien, le
norvégien, le portugais et le suédois. Le manque de ligature
entre les « ij » néerlandais, 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, slovaque, slovène et tchèque.
- 8859-3 (latin-3)
- Le latin-3 est utilisé pour les textes en esperanto,
gallois, maltais et turc.
- 8859-4 (latin-4)
- Le latin-4 introduit des lettres pour l'estonien et le
lituanien. Il est presque obsolète, remplacé par 8859-10
(latin-6) et 8859-13 (latin-7).
- 8859-5
- L'alphabet cyrillique est utilisé en bulgare,
biélorusse, macédonien, russe, serbe et ukrainien. Les
Ukrainiens prononcent la lettre « ghe » fermée,
comme « heh » et auraient besoin d'un accent pour
distinguer le « ghe » correct. Consultez les remarques
concernant le KOI8-R ci-dessous.
- 8859-6
- Prend en charge l'arabe. La table 8859-6 est une police de
caractères de largeur fixe, mais un affichage correct doit combiner
les lettres en utilisant leurs formes initiale, centrale et finale.
- 8859-7
- Prend en charge le grec moderne.
- 8859-8
- Prend en charge l'hébreu sans niqqud (diacritiques).
Les niqqud et l'hébreu biblique dans son ensemble sont en dehors de
la portée de ce jeu de caractères ; sous Linux, UTF-8 est
recommandé pour cela.
- 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
(Groënland) et sami (lappon) qui manquaient dans le latin 4 pour
couvrir toute la zone nordique. La RFC 1345 indique un latin 6
préliminaire et différent. Le sami nécessite en
réalité plus d'accents que ceux proposés.
- 8859-11
- Cela n'existe qu'en tant que proposition rejetée. Il
s'agit d'une version identique au TIS-620, utilisé sous Linux pour le
thaï.
- 8859-12
- Ce jeu n'existe pas. On a proposé de l'utiliser pour
le vietnamien, mais il ne tient pas dans les 96 caractères (sans
combinaisons) offerts par l'ISO 8859. L'UTF-8 est le jeu de
caractère préféré pour l'utilisation du vietnamien
sous Linux.
- 8859-13 (latin-7)
- Prend en charge les langues des pays baltes, en particulier
les caractères lituaniens absents du latin-4.
- 8859-14 (latin-8)
- Jeu de caractères celtique, couvrant le gaélique
et le gallois. Ce jeu contient les caractères pointés
nécessaires pour l'irlandais ancien.
- 8859-15 (latin-9)
- Dans ce jeu se trouvent le symbole euro et les ligatures
françaises qui manquaient dans le latin-1.
- 8859-16 (latin-10)
- Ce jeu recouvre la plupart des langues du 8859-2, et prend
mieux en charge le roumain.
KOI8-R¶
Le KOI8-R est un jeu de caractères non ISO très répandu en
Russie. La première moitié correspond à l'ASCII US, la seconde
est un jeu de caractère cyrillique un peu mieux conçu que
l'ISO 8859-5. Le KOI8-U est un jeu commun, basé sur le KOI8-R, qui a
une meilleure prise en charge de l'ukrainien. Aucun de ces jeux n'est
compatible avec l'ISO-2022, contrairement à l'ISO-8859.
La prise en charge 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 police du gestionnaire de console.
JIS X 0208¶
JIS X 0208 est un jeu de caractères standard japonais. Bien qu'il
y ait plusieurs jeux de caractères standard japonais, (comme
JIS X 0201, JIS X 0212, et JIS X 0213), celui-ci
est le plus important. Les caractères sont projetés dans une matrice
de deux octets 94x94, dont chaque octet est dans l'intervalle 0x21-0x7E. Notez
que JIS X 0208 est un jeu de caractères, pas un encodage. Cela
signifie que JIS X 0208 lui-même n'est pas utilisé pour
exprimer des données de texte. Il est utilisé comme composant pour
construire un encodage comme EUC-JP, Shift_JIS, et ISO-2022-JP. EUC-JP est le
plus important encodage sous Linux et inclut l'ASCII US et le
JIS X 0208. Dans l'EUC-JP, les caractères du
JIS X 0208 sont exprimés sur deux octets, chacun étant le
code JIS X 0208 plus 0x80.
KS X 1001¶
KS X 1001 est un jeu de caractères standard coréen. Comme
dans le JIS X 0208, les caractères sont projetés dans une
matrice 94x94 sur deux octets. KS X 1001 est utilisé, comme le
JIS X 0208, comme composant pour construire un encodage comme le
EUC-KR, Johab, et ISO-2022-KR. EUC-KR est l'encodage le plus important sous
Linux et inclut l'ASCII US et le KS X 1001. KS C 5601 est
un ancien nom pour le KS X 1001.
GB 2312¶
GB 2312 est le principal jeu de caractères chinois, utilisé pour
exprimer le chinois simplifié. Comme avec le JIS X 0208, les
caractères sont projetés dans une matrice 94x94 sur deux octets pour
construire l'EUC-CN. Celui-ci est l'encodage le plus important sous Linux et
inclut l'ASCII US et le GB 2312. Notez que l'EUC-CN est souvent
appelé GB, GB 2312 ou CN-GB.
Big5¶
Big5 est un jeu de caractères populaire à Taïwan pour exprimer le
chinois traditionnel (Big5 est à la fois un jeu de caractères et un
encodage). C'est un surensemble de l'ASCII. Les caractères non ASCII sont
exprimés sur deux octets. Les octets 0xA1-0xFE sont utilisés en
préambule pour les caractères de deux octets. Le Big5 et son
extension sont largement utilisés à Taiwan et Hong-Kong. Il n'est
pas compatible ISO 2022.
TIS-620¶
Le TIS-620 est un jeu de caractère standard thaï, et un surensemble de
l'ASCII US. Comme la série des ISO 8859, les caractères
thaïs sont projetés dans l'intervalle 0xA1-0xFE. Le TIS-620 est le
seul jeu de caractères couramment utilisé sous Linux, hormis
l'UTF-8, avec des caractères combinés.
UNICODE¶
L'Unicode (ISO 10646) est une norme destinée à représenter
sans ambiguïté tous les signes écrits de toutes les langues
humaines connues. La structure de l'Unicode offre 21 bits pour chaque
caractère. Comme les ordinateurs n'ont pas d'entiers avec 21 bits,
l'encodage Unicode interne est sur 32 bits, et en externe sur des
séries d'entiers 16 bits (UTF-16) (qui ne nécessite deux
entiers 16 bits que pour des caractères rares) ou une série
d'octets 8 bits (UTF-8). Des informations supplémentaires sur
l'Unicode sont disponibles sur
http://www.unicode.org
Linux représente l'Unicode en utilisant le format de transfert 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, à 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, 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 progression continue jusqu'à des
codes sur 6 octets.
Pour les utilisateurs de l'ISO-8859, cela signifie que les caractères avec
le bit de poids fort à 1 sont désormais codés sur deux octets.
Cela tend à allonger la taille des fichiers textes ordinaires de quelques
pour cent (N.d.T. : il n'y a pas de problèmes de conversion
néanmoins, car les symboles Unicode correspondant aux caractères
ISO-8859 conservent les mêmes valeurs, étendues avec 8 bits
à zéro en tête). Pour le russe ou le grec, la taille des
fichiers textes ordinaires est généralement doublée car la
plupart des caractères sont en dehors de l'ASCII. Pour les utilisateurs
japonais, cela signifie que les codes sur 16 bits couramment
employés prendront désormais 3 octets. Des conversions
algorithmiques sont possibles depuis certains jeux de caractères (en
particulier ISO-8859-1) vers l'UTF-8, mais une conversion générique
nécessite l'utilisation de tables de conversion, qui peuvent être
assez larges pour des codes sur 16 bits.
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 (« \0 ») ou
« / » faisant partie d'un code plus grand.
Comme l'ASCII, et en particulier NUL et « / », n'est pas
modifié, 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 » correspondant à 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. Cela
signifie qu'en mode UTF-8, on peut utiliser un jeu de caractères avec
512 symboles différents. Ce n'est pas assez pour le japonais, le
chinois ou le coréen, mais c'est généralement suffisant pour
toutes les autres utilisations.
À l'heure actuelle, le pilote de la console ne permet pas d'utiliser les
caractères combinants. Les langues thaï, sioux, et toute autre
nécessitant des caractères combinants ne peuvent pas être
utilisées sur la console.
ISO 2022 et ISO 4873¶
Les normes ISO 2022 et 4873 décrivent un modèle de contrôle
des polices basé sur le fonctionnement du VT100. Ce modèle est
(partiellement) pris en charge 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 caractè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 LS
n réclame le jeu G
n pour les codes
dont le bit de poids fort est à zéro. La fonction S
n demande
le jeu G
n pour les codes dont le bit de poids fort est à un. La
fonction SS
n réclame le jeu G
n (
n=2 ou 3) pour le
caractère suivant uniquement (quelle que soit la valeur du bit de poids
fort).
Un jeu de 94 caractères est désigné comme jeu G
n 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 de la
norme ISO 2375 International Register of Coded Character Sets. Par
exemple, ESC ( @ sélectionne le jeu ISO 646 en tant que G0, ESC ( A
sélectionne le jeu standard britannique (avec la livre sterling à la
place du dièse), ESC ( B sélectionne l'ASCII, ESC ( M
sélectionne un jeu de caractères africain, ESC ( ! A
sélectionne les caractères cubains, etc.
Un jeu de 96 caractères est désigné comme jeu G
n 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 hébreu comme G1.
Un jeu de caractères multioctets est désigné comme jeu G
n
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électionné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, respectivement.
VOIR AUSSI¶
console(4),
console_codes(4),
console_ioctl(4),
ascii(7),
iso_8859-1(7),
unicode(7),
utf-8(7)
COLOPHON¶
Cette page fait partie de la publication 3.44 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
<
http://www.kernel.org/doc/man-pages/>.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et
l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande «
man -L C
<section> <page_de_man> ».