20.7. Reconnaissance de Systèmes de Codage

La plupart du temps, Emacs peut reconnaître quel système de codage utiliser pour un fichier donné--une fois que vous avez spécifié vos préférences.

Certains systèmes de codae peuvent être reconnus ou distingués par les séquences d'octets apparaissant dans les données. Cependant, des systèmes de codage ne peuvent être distingués, même partiellement. Par exemple, il n'y a pas de moyen de distinguer entre Latin-1 et Latin-2 ; ils utilisent les mêmes valeurs d'octets avec différentes significations.

Emacs traite cette situation grâce à une liste de priorité de systèmes de codage. Lorsqu'Emacs lit un fichier, si vous ne spécifiez pas le système de codage à utiliser, Emacs compare les données avec chaque système de codage, en commençant par le premier en priorité et en descendant la liste, jusqu'à ce qu'il trouve un système de codage s'accordant avec les données. Il convertit alors le contenu du fichier en supposant qu'il est représenté dans ce système de codage.

La liste de priorité de systèmes de codage dépend de l'environnement de langue sélectionné (Section 20.3). Par exemple, si vous utilisez le français, vous voulez certainement qu'Emacs préfère Latin-1 à Latin-2 ; si vous utilisez le tchèque, vous voulez certainement que Latin-2 soit préféré. C'est une des raisons de spécifier un environnement de langue.

Cependant, vous pouvez modifier la liste de priorité en détail avec la commande M-x prefer-coding-system. Cette commande lit le nom d'un système de codage depuis le mini-tampon, et l'ajoute au début de la liste de priorité, pour qu'il soit préféré à tous les autres. Si vous utilisez cette commande plusieurs fois, chaque utilisation ajoute un élément au début de la liste de priorité.

Parfois un nom de fichier indique quel système de codage utiliser pour ce fichier. La variable file-coding-system-alist spécifie cette correspondance. Il existe une fonction spéciale modify-coding-system-alist pour ajouter des éléments à cette liste. Par exemple, pour lire et écrire tous les .txt en utilisant le système de codage china-iso-8bit, vous pouvez utilliser cette expression Lisp :

(modify-coding-system-alist 'file "\\.txt\\'" 'china-iso-8bit)

Le premier argument doit être file, le second argument doit être une expression rationnelle qui détermine à quels fichiers l'appliquer, et le troisième argument indique quel système de codage utiliser pour ces fichiers.

Vous pouvez spécifier le système de codage pour un fichier en particulier en utilisant la construction -*-…-*- en début de fichier, ou une liste de variables locales à la fin (Section 32.2.5). Vous faites cela en définissant une valeur pour une "variable" coding ; plutôt que de définir une variable, cela spécifie le système de codage pour le fichier. Par exemple, -*-mode: C; coding: latin-1;-*- indique d'utiliser le système de codage Latin-1, ainsi que le mode C.

Une fois qu'Emacs a choisi un système de codage pour un tampon, il stocke ce système de codage dans buffer-file-coding-system et utilise ce système de codage, par défaut, pour les opérations qui écrivent à partir de ce tampon dans un fichier. Cela inclut les commandes save-buffer et write-region. Si vous désirez écrire des fichiers à partir de ce tampon en utilisant un système de codage différent, vous pouvez spécifier un autre système de codage pour ce tampon en utilisant set-buffer-file-coding-system (Section 20.8).

Lorsque vous envoyez un message avec le mode Mail (Chapter 28), Emacs a quatre manières différentes de déterminer le système de codage à utiliser pour encoder le texte du message. Il essaie la valeur pour le tampon lui-même de buffer-file-coding-system, si elle est non nil. Autrement, il utilise la valeur de sendmail-coding-system, si elle est non nil. Le troisième moyen est d'utiliser le système de codage par défaut pour les nouveaux fichiers, qui est contrôlé par votre choix d'environnement de langue, si elle est non nil. Si ces trois valeurs sont nil, Emacs encode le message à envoyer en utilisant le système de codage Latin-1.

Lorsque des messages arrivent pour vous dans Rmail, chaque message est automatiquement traduit à partir du système de codage dans lequel il est écrit--comme s'il était dans un fichier séparé. Ceci utilise la liste de priorité de systèmes de codage que vous avez spécifié.

Pour lire et écrire les fichiers Rmail eux-mêmes, Emacs utilise le système de codage spécifié par la variable rmail-file-coding-system. La valeur par défaut est nil, ce qui indique que les fichiers Rmail ne sont pas convertis (ils sont lus et écrits dans le code de caractères interne d'Emacs).