UTF-8

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page UTF-8 and the translation is 79% complete.
Outdated translations are marked like this.
Resources

UTF-8 est un procédé de chiffrage de caractères sur un nombre variable d'octets (en l'occurrence de 1 à 4 octets) par symbole. Le premier octet de l' UTF-8 est utilisé pour les caractères de l'ASCII, conférant ainsi au jeu de caractères une rétrocompatibilité avec l'ASCII. UTF-8 signifie que les caractères ASCII et les caractères latins sont interchangeables au prix d'une légère augmentation de la taille des données, parce que seul le premier octet est utilisé. Les utilisateurs d'alphabets de l'Est comme le Japonais, à qui ont a assigné une plage d'octets plus élevée ne sont pas satisfait car cela conduit à une redondance de plus de 50% dans leurs données.

Encodage des caractères

Qu'est-ce que l'encodage des caractères ?

Les ordinateurs ne comprennent eux-mêmes pas les textes imprimés comme les humains. Pour les ordinateurs, chaque caractère est représenté par un nombre. Traditionnellement, chaque jeu de nombres utilisé pour représenter les alphabets et les caractères (connus sous le nom de système de codage, encodage, ou jeu de caractères) était limité en taille à cause de la limitation même du matériel constituant les ordinateurs.

L'histoire de l'encodage des caractères

Le plus courant (ou du moins le plus largement accepté) des jeux de caractères est l'ASCII (American Standard Code for Information Interchange). Il est largement reconnu que l'ASCII est la norme logicielle la plus réussie jamais créée. L'ASCII moderne a été normalisé en 1986 (ANSI X3.4, RFC 20, ISO/IEC 646:1991, ECMA-6) par l'American National Standards Institute.

ASCII, a strictement parler, est encodé sur 7 chiffres binaires, ce qui signifie qu'il utilise des motifs de chiffres représentables avec 7 chiffres binaires. Ce qui correspond à la plage 0 à 127 en décimal. Ceci inclut 32 caractères de contrôle non visualisables, en majorité entre 0 et 31, auxquels s'ajoute le caractère de contrôle final, DEL ou delete, dont la représentation est 127. Tous les caractères entre 32 et 126 inclus, sont visualisables : l'espace, les marques de ponctuation, les lettres latines et les chiffres.

Le huitième bit en ASCII était à l'origine utilisé comme bit de parité pour la détection d'erreurs. Si la détection d'erreurs n'est pas souhaitée, on peut le laisser à 0. Ceci signifie que, avec l'ASCII, chaque caractère est représenté par un seul octet.

Bien que l'ASCII soit suffisant pour communiquer en anglais moderne, dans d'autres langues européennes qui comprennent des caractères accentués, les choses ne sont pas aussi simples. Les normes ISO 8859 ont été développées pour satisfaire ces besoins. Elles sont rétrocompatibles avec l'ASCII, mais au lieu de laisser le huitième chiffre binaire à 0, elles l'utilisent pour former un autre ensemble de 127 caractères dans chacun des encodages. Les limitations des normes ISO 8859 sont apparues très vite, et il y a aujourd'hui 15 variantes de la norme ISO 8859 (8859-1 à 8859-15). En dehors de la plage compatible avec l'ASCII, il y a souvent des conflits entre les lettres représentées par chacun des octets. Pour compliquer encore l'interopérabilité entre versions, la norme Windows-1252 est utilisée à leurs place dans certaines versions de Microsoft Windows pour les langues européennes. Il s'agit d'un jeu étendu de ISO-8859-1, cependant il en diffère de plusieurs façons. Tous ces jeux restent néanmoins compatibles avec ASCII.

Le développement nécessaire d'encodages mono-octets pour des alphabets non latins, tels que EUC (Extended Unix Coding) qui est utilisé pour le Japonais et le Coréen (et dans une moindre mesure pour le Chinois) a créé encore plus de confusion. D'autres systèmes d'exploitation utilisaient encore des jeux de caractères différents pour les mêmes langues, par exemple, Shift-JIS et ISO-2022-JP. Les utilisateurs désireux d'afficher des glyphes cyrilliques avaient à choisir entre KOI8-R pour le Russe et le Bulgare ou KOI8-U pour l'Ukrainien, aussi bien que parmi les autres encodages cyrilliques comme le peu prisé ISO 8859-5 et le plus connu Windows-1251. Tous ces jeux de caractères rompaient la compatibilité avec ASCII. Il faudrait cependant mentionner que le jeu KOI8 place les caractères cyrilliques dans l'ordre latin, de telle manière que si le huitième chiffre binaire est retiré, le texte est déchiffrable sur un terminal ASCII via une translittération à casse inversée.

Tout cela conduisait à la confusion générale, et à une presque totale incapacité à communiquer dans plusieurs langues ; en particulier à travers des alphabets différents. C'est là qu'Unicode entre en scène.

Qu'est-ce qu'Unicode ?

La norme Unicode jette aux orties la limite traditionnelle d'un octet pour les jeux de caractères. Elle utilise 17 plans de 65 536 points de code pour décrire un maximum de 1 114 112 caractères. Comme le premier plan, aussi connu sous le nom de Basic Multilingual Plane (Plan Multilingue de Base) ou BMP, contient presque tous les caractères dont un utilisateur aura jamais besoin, beaucoup ont fait la supposition fausse que l'Unicode était un jeu de caractères encodé sur 16 chiffres binaires.

Unicode a été cartographié de différentes manières, mais les deux plus courantes sont UTF (Unicode Transformation Format pour Format de transformation d'Unicode) et UCS (Universal Character Set pour Jeu de caractères universel). Le nombre après UTF indique le nombre de chiffres binaires dans chacun des éléments, tandis que le nombre après UCS indique le nombre d'octets. UTF-8 est devenu le moyen le plus répandu pour l'échange de texte Unicode en raison de sa nature 8 chiffres binaires pure ; c'est de ce fait l'objet de ce document.

Ce que UTF-8 peut faire

UTF-8 permet aux utilisateurs de travailler dans un environnement multilingue conforme aux normes et reconnu internationalement, avec une redondance des données comparativement faible. UTF-8 est le moyen privilégié pour transmettre les caractères non ASCII sur Internet, via des courriels, l'IRC, ou presque n'importe quel autre médium. En dépit de cela, beaucoup de gens considèrent la communication en ligne en UTF-8 comme abusive. Il est toujours bon d'être conscient de cela sur certains canaux, listes de diffusion, ou groupes Usenet avant d'employer des caractères non ASCII en UTF-8.

Installer l'UTF-8 sur Gentoo Linux

Trouver ou créer des locales UTF-8

Maintenant que les principes d'Unicode ont été établis, il est temps d'utiliser UTF-8 !

Pour les utilisateurs qui veulent en savoir plus, une explication détaillée peut-être trouvée dans le Guide de localisation Gentoo.

Ensuite, l'utilisateur doit décider si une locale UTF-8 est déjà disponible pour la langue choisie, ou si elle doit être générée.

user $locale -a | grep 'en_GB'
en_GB
en_GB.utf8

De la sortie de la commande ci-dessus, chercher un résultat avec un suffixe similaire à .utf8. S'il n'y a aucun résultat avec un suffixe similaire, une locale compatible UTF-8 doit être créée. La commande liste les suffixes en caractères minuscule sans aucun traits d'union, glibc comprend les deux formes du suffixe, mais plusieurs autres programmes ne le font pas. L'exemple le plus commun étant X. Donc, c'est toujours mieux d'utiliser UTF-8 en préférence à utf8.

The command lists the suffix in lower case without any hyphens, glibc understands both forms of the suffix, many other programs don't. The most common example of which is Xorg. So it is best to always use UTF-8 in preference to utf8.

Remarque
N'exécuter le code suivant que si le système ne possède pas de locale UTF-8 disponible pour la langue choisie.

Remplacer "en_GB" avec le code de locale souhaité :

root #localedef -i en_GB -f UTF-8 en_GB.UTF-8

Une autre façon d'inclure une locale UTF-8 est de l'ajouter au fichier /etc/locale.gen et de générer les locales nécessaires en utilisant la commande locale-gen. Les locales seront écrites dans le fichier /usr/lib/locale/locale-archive.

CODE Ligne dans /etc/locale.gen
en_GB.UTF-8 UTF-8
root #locale-gen
 * Generating 1 locales (this might take a while) with 1 jobs
 *  (1/1) Generating en_GB.UTF-8 ...                            [ ok ]
 * Generation complete

Définir la locale

Il y a une variable d'environnement qui doit être définie de manière à ce que le système utilise les nouvelles locales UTF-8 : LC_CTYPE (optionnellement, modifier la variable LANG pour également changer la langue du système). Il y a aussi différentes manières de la définir ; certains administrateurs systèmes préfèrent avoir un environnement UTF-8 pour un utilisateur donné, auquel cas ils la définissent dans leur fichier ~/.profile (/bin/sh pour les utilisateurs de Bourne shell), ~/.bash_profile ou ~/.bashrc (/bin/bash pour les utilisateurs de Bourne again shell). Plus de détails et de bonnes pratiques sont disponibles dans le Guide de localisation Gentoo.

D'autres encore préfèrent la définir globalement. Une circonstance particulière où il est fortement recommandé de procéder de cette manière est quand /etc/init.d/xdm est utilisé, parce que ce script d'initialisation lance le gestionnaire d'écran et le bureau avant qu'aucun des scripts de démarrage mentionnés précédemment ne soit évalués. En d'autre termes, l'action est réalisée avant qu'aucune des variables ne soit chargée dans l'environnement.

Définir la locale globalement doit être fait en utilisant le fichier /etc/env.d/02locale. Ce fichier doit ressembler à quelque chose comme ce qui suit :

FILE /etc/env.d/02localeDémonstration pour en_GB.UTF-8
## (Comme d'habitude, remplacer "en_GB.UTF-8" par la valeur de locale appropriée; chaque langue a une valeur différente!)
LANG="en_GB.UTF-8"
Remarque
Il est possible de remplacer la variable LC_CTYPE par la variable LANG. Pour plus d'informations sur les catégories affectées par l'utilisation de LC_CTYPE, lire la Documentation GNU.

Ensuite, l'environnement doit être mis à jour en exécutant la commande suivante :

root #env-update
>>> Regenerating /etc/ld.so.cache...
root #source /etc/profile

Maintenant, exécuter la commande locale sans arguments pour voir si les variables correctes ont été chargées dans l'environnement.

root #locale
LANG=en_GB.utf8
LC_CTYPE="en_GB.utf8"
LC_NUMERIC="en_GB.utf8"
LC_TIME="en_GB.utf8"
LC_COLLATE="en_GB.utf8"
LC_MONETARY="en_GB.utf8"
LC_MESSAGES="en_GB.utf8"
LC_PAPER="en_GB.utf8"
LC_NAME="en_GB.utf8"
LC_ADDRESS="en_GB.utf8"
LC_TELEPHONE="en_GB.utf8"
LC_MEASUREMENT="en_GB.utf8"
LC_IDENTIFICATION="en_GB.utf8"
LC_ALL=

Les valeurs de variables d'environnement locale qui ont été configurées explicitement, par exemple dans une déclaration d'exportation (si bash est utilisé) sont listées sans double guillemets. Celles que les valeurs ont été héritées d'autres variables d'environnement ont leurs valeurs en double guillemets.

Sinon, en utilisant eselect pour définir les locales

Même s'il est bon d'entretenir le système comme décrit ci-dessus, il est possible de vérifier la locale correctement configurée en utilisant l'utilitaire eselect.

Although it is good to maintain the system as described above, it is possible to verify the correct locale configured using the eselect utility.

Utiliser eselect pour lister toutes les locales disponibles sur le système :

root #eselect locale list
  [1] C
  [2] POSIX *
  [3] en_GB.utf8
  [ ] (free form)

Utiliser eselect pour définir la locale est aussi simple que pour les lister. Une fois que la bonne locale a été choisie, exécuter:

root #eselect locale set 3
Setting LANG to en_GB.utf8 ...

Vérifier le résultat :

root #eselect locale list
  [1] C
  [2] POSIX
  [3] en_GB.utf8 *
  [ ] (free form)

Au cas où il ait préféré d'avoir /etc/env.d/02locale avec .UTF-8 au lieu de .utf8, exécuter la commande eselect correspondante :

root #eselect locale set en_GB.UTF-8
Setting LANG to en_GB.UTF-8 ...
root #eselect locale list
  [1] C
  [2] POSIX
  [3] en_GB.utf8
  [4] en_GB.UTF-8 *
  [ ] (free form)

Exécuter la commande suivante va mettre à jour les variables du shell :

root #env-update && source /etc/profile
>>> Regenerating /etc/ld.so.cache...

C'est tout. Le système utilise désormais les locales UTF-8. Le prochain obstacle est la configuration des applications utilisées quotidiennement.

Prise en charge par les applications

Lorsque Unicode commença à prendre son essor dans le monde du logiciel, les jeux de caractères multi-octets n'étaient pas très adaptés à des langages de programmation tels que le langage C, qui est le langage de base pour beaucoup de programmes couramment utilisés. Même aujourd'hui, certains programmes ne sont pas capables de prendre en charge l'UTF-8 correctement. Fort heureusement, la majorité des programmes, surtout les plus utilisés, sont supportés.

(V)FAT

Pour le support de l'UTF-8 dans les systèmes de fichiers FAT, se référer à l'article FAT

Noms de fichiers

Pour changer l'encodage des noms de fichiers, app-text/convmv peut être utilisé.

root #emerge --ask app-text/convmv

Le format de la commande convmv est le suivant :

root #convmv -f <encodage-actuel> -t utf-8 <nom-du-fichier>

Remplacer iso-8859-1 par le jeu de caractères à partir duquel la conversion est effectuée :

root #convmv -f iso-8859-1 -t utf-8 filename

Pour changer le contenu de fichiers, utiliser l'utilitaire iconv, il est fourni avec glibc et devrait être installé sur tous les systèmes Gentoo. Remplacer iso-8859-1 par le jeu de caractères à partir duquel la conversion est effectuée. Après avoir exécuté la commande, vérifier que la sortie est saine :

root #iconv -f iso-8859-1 -t utf-8 filename

Pour convertir un fichier, un autre fichier doit être créé :

root #iconv -f iso-8859-1 -t utf-8 filename > newfile

Le paquet recode (app-text/recode) peut aussi être utilisé à cet effet.

La console système

Pour activer UTF-8 dans la console, éditer /etc/rc.conf. Définir unicode="yes", et lire aussi les commentaires du fichier -- c'est important d'avoir une police de caractères qui dispose d'une bonne plage de caractères pour une meilleure utilisation d'Unicode. Pour que cela fonctionne, s'assurer que la locale Unicode a été correctement créée.

La variable keymap, définie dans /etc/conf.d/keymaps, devrait spécifier une carte de clavier Unicode.

CODE Exemple d'extrait de /etc/conf.d/keymaps
## (Remplacer "uk" par l'arrangement de clavier local)
keymap="uk"

Ncurses et Slang

Remarque
Ignorer toute référence à Slang dans cette section si ce n'est pas installé ou si ce n'est pas nécessaire.

Il est sage d'ajouter unicode aux options globales de la variable USE dans le fichier /etc/portage/make.conf, et de réinstaller sys-libs/ncurses et sys-libs/slang. Portage le fera automatiquement si les options --changed-use ou --newuse sont utilisées. Exécuter la commande suivante pour installer le paquet :

root #emerge --update --deep --newuse @world

Il faut également recompiler les paquets qui possèdent un lien vers ceux-là, maintenant que les changements de la variable USE ont été appliqués. L'outil à utiliser (revdep-rebuild) fait partie du paquet app-portage/gentoolkit.

root #revdep-rebuild --library libncurses.so.5
root #revdep-rebuild --library libslang.so.1

KDE, GNOME, et Xfce

Tous les environnements de bureau majeurs prennent totalement en charge l'Unicode, et ne nécessitent pas d'autres étapes de configuration que celles décrites dans ce guide. Ceci est dû au fait que les boîtes à outils graphiques sous-jacentes (Qt ou GTK 2) sont prédisposées UTF-8 et que, par conséquent, les applications qui s'appuient sur ces boîtes à outils le sont également dès l'installation.


Dans les applications basées sur GTK+, la combinaison des touches pour l'insertion Unicode héxadécimale est Ctrl+Shift+u+<hex digit>. Par example, le charactère unicode ✔ qui a le nombre unicode U+2714 peut être écrit avecCtrl+Shift+u+2714+Entrée, et sera rendu en tant que .


X11 et polices de caractères

Les polices de caractères TrueType prennent en charge l'Unicode, et la plupart des polices qui arrivent avec Xorg disposent d'une prise en charge étendue, bien qu'évidemment, tous les glyphes particuliers accessibles par Unicode aient été créés pour ces polices. Pour compiler les polices (y compris le jeu Bitstream Vera) avec la prise en charge des caractères est asiatiques dans X, s'assurer que l'option cjk de la variable USE est définie. Beaucoup d'autres applications utilisent cette option, c'est pourquoi, il est judicieux de l'ajouter aux options permanentes de la variable USE.

Il y a aussi plusieurs paquets de polices de caractères dans Portage qui sont prédisposées Unicode. Voir la page Fontconfig/fr pour plus d'informations sur les polices recommandées et leur configuration.

Gestionnaires de fenêtres et émulateurs de terminal

Les gestionnaires de fenêtres qui ne sont pas construits sur GTK ou Qt n'ont généralement pas une très bonne prise en charge de l'Unicode, car ils utilisent souvent la bibliothèque Xft pour les polices. Si le gestionnaire de fenêtres n'utilise pas les polices Xft, il est alors possible d'utiliser la spécification de police de caractères mentionnée dans les sections précédentes en tant que police Unicode.

Les émulateurs de terminal qui utilisent Xft et prennent en charge l'Unicode sont plus difficiles à trouver. En plus de Konsole et de GNOME Terminal, les meilleures options dans Portage sont x11-terms/rxvt-unicode, x11-terms/xfce4-terminal, gnustep-apps/terminal, x11-terms/mlterm, ou x11-terms/xterm quand il est compilé avec l'option unicode de la variable USE et invoqué comme uxterm. app-misc/screen prend en charge l'UTF-8 également, lorsqu'il est invoqué comme screen -U ou lorsque ce qui suit est placé dans le fichier ~/.screenrc :

CODE Contenu de ~/.screenrc pour le support d'UTF-8
defutf8 on

Vim, emacs, xemacs et nano

Vim fournit une prise en charge totale de l'UTF-8, et dispose d'une détection des fichiers UTF-8 en interne. Pour plus d'informations sur Vim, utiliser :help mbyte.txt.

GNU Emacs depuis la version 23 et XEmacs version 21.5 prennent totalement en charge l'UTF-8. GNU Emacs 24 prend aussi en charge l'édition de textes bidirectionnels.

Nano fournit une prise en charge totale de l'UTF-8 depuis la version 1.3.6.

Shells

Ordinairement, bash assure une prise en charge totale de l'UTF-8 via la bibliothèque GNU readline. Z shell (zsh) fournit une prise en charge de l'Unicode avec l'option unicode de la variable USE.

Le shell C, tcsh et ksh ne fournissent aucune prise en charge de l'UTF-8.

Irssi

Irssi dispose d'une prise en charge totale de l'UTF-8, bien que cela nécessite la définition d'une option par l'utilisateur.

[irssi]set term_charset UTF-8

Pour les canaux dans lesquels des caractères non-ASCII sont souvent échangés dans des jeux de caractères non-UTF-8, la commande /recode peut être utilisée pour convertir les caractères. Taper /help recode pour plus d'informations.

Mutt

Le client de messagerie Mutt dispose d'une très bonne prise en charge d'Unicode. Pour utiliser UTF-8 avec Mutt, rien n'est à mettre dans les fichiers de configuration. Mutt travaille dans un environnement Unicode sans modification si tous les fichiers de configuration (y compris la signature) sont encodés UTF-8.

Remarque
Il est toujours possible de voir '?' dans un courriel lu avec Mutt. Cela est le résultat de quelqu'un qui utilise un client de messagerie qui ne spécifie aucun jeu de caractères. Il n'y pas grand chose à faire d'autre que de lui demander de configurer son client correctement.

Une information complémentaire est disponible sur le Mutt Wiki .

links et elinks

Il s'agit ici de navigateurs textuels, et ce qui suit présente comment activer la prise en charge de l'UTF-8. Pour elinks et links, il y deux façons d'y parvenir, l'une en utilisant une option de configuration interne au navigateur, l'autre en éditant un fichier de configuration. Pour utiliser l'option interne du navigateur, ouvrir un page Web avec elinks ou links, puis, faire Alt+S au clavier pour entrer dans le menu de configuration. Sélectionner alors la dernière option UTF-8 I/O en pressant Entrée. Sauvegarder et quitter le menu. Sur links il est possible d'avoir à faire à nouveau Alt+S et à appuyer sur la touche S pour sauvegarder. Le fichier de configuration est présenté ci-dessous :

CODE Activer UTF-8 pour elinks/links
## (Pour elinks, éditer /etc/elinks/elinks.conf ou ~/.elinks/elinks.conf et ajouter la ligne suivante.)
set terminal.linux.utf_8_io = 1

## (Pour links, éditer ~/.links/links.cfg et ajouter la ligne suivante.)
terminal "xterm" 0 1 0 us-ascii utf-8

Samba

Samba est une suite logicielle qui met en œuvre le protocole SMB (Server Message Block) pour les systèmes UNIX tels que les Macs, Linux et FreeBSD. Le protocole est aussi parfois appelé le Common Internet File System (CIFS). Samba inclut aussi le système NetBIOS - utilisé pour le partage de fichiers à travers des réseaux Windows.

Ajouter ce qui suit sous la section [global] :

root #nano -w /etc/samba/smb.conf
dos charset = 1255
unix charset = UTF-8
display charset = UTF-8
root #nano -w /etc/samba/smb.conf
dos charset = 1255
unix charset = UTF-8
display charset = UTF-8

Test complet

Il y a de nombreux sites web de test en UTF-8 et la plupart des navigateurs web disponibles dans Gentoo disposent d'une prise en charge complète de l'UTF-8.

Lorsque l'un des navigateurs textuels est utilisé, il est important de bien s'assurer d'utiliser un terminal prédisposé UTF-8.

Si certains caractères s'affichent sous forme de boîte avec des lettres ou des chiffres dedans, cela signifie que la police de caractères utilisée ne dispose pas de caractère pour le symbole ou le glyphe attendu par UTF-8. À la place, elle affiche une boîte avec le code hexadécimal du symbole UTF-8.

Problèmes connus

Fichiers de configuration système (dans /etc)

La plupart des fichiers de configuration (tel que /etc/fstab) ne prennent pas en charge l'UTF-8. Il est recommandé de s'en tenir aux caractères ASCII pour ces fichiers.

Ressources externes