[Linux-bruxelles] Problème d'encodage de caractères

Ludovic Brenta ludovic.brenta at insalien.org
Mer 28 Mai 11:15:59 CEST 2003


Christophe Schockaert <Christophe.Schockaert at spacebel.be> writes:

> J'ai beau mettre la même des 2 côtés, un fichier créé sur l'un n'est pas
> lisible convenablement sur l'autre.
>  
> > Sur RH 7.1, l'encodage est probablement ISO-8859-1 (Latin-1), qui
> > encode chaque caractère sur 8 bits.
> Et comment je peux le voir ?
>  
> > Sur Red Hat 9, l'encodage est UTF-8
> J'imagine puisque LANG=en_US.UTF-8
> 
> > Personnellement, je recommande de tout convertir à l'UTF-8
> OK, ça  ne me dérange pas de convertir ce qui existe déjà mais j'aimerais
> surtout trouver un moyen pour ne plus devoir faire la conversion à l'avenir.
> Autrement dit, comment spécifier l'encodage UTF-8 par défaut sur ma RH 7.1 ?
 
Cela dépend de l'application utilisée.  Tu peux mettre ceci dans ton
.emacs, par exemple:

(prefer-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
 
> > Le principal problème, c'est qu'un "simple fichier texte" est
> > tellement simple qu'il n'indique pas explicitement l'encodage utilisé;
> > c'est la locale qui le décide.  Si possible, ce serait une bonne idée
> > d'indiquer l'encodage dans chaque fichier.
> Oui, mais non, enfin  je vois pas comment je peux spécifier l'encodage dans
> un script Perl ou bash... ni dans un fichier texte style README...

Facile, toujours dans emacs, il y a deux solutions.

Soit, dans la première ligne de ton script perl ou fichier texte, tu
mets le commentaire "magique" suivant:

#!/bin/perl # Mighty Emacs, please use -*- mode: Perl; coding: utf-8 -*-

Ce sont les délimiteurs -*- qui comptent pour emacs.  Soit, à la fin
de ton fichier, tu mets des commentaires comme ceci:

# Local Variables:
# coding: utf-8
# (tu peux ajouter d'autres variables ici)
# End:

Ceci fonctionne quelle que soit la syntaxe pour les commentaires; ce
qui compte ce sont les chaînes magiques "Local variables:" et "End:",
et le fait que "End:" doit être la dernière ligne non vide du fichier.
Par exemple,

/* This may look like C, but it is really -*- C++ -*- */


/* Les normes ISO C et C++ définissent le jeu de caractère du langage
   (un sous-ensemble de l'ASCII 7 bits), mais ne définissent pas
   l'encodage.  Ce qui se passe quand un fichier source contient des
   caractères qui ne sont pas dans la norme est donc NON DÉFINI.  En
   général, les compilateurs ne font aucune conversion quand ils
   rencontrent des chaînes littérales, donc le programmeur doit
   s'assurer que l'encodage n'introduit pas d'octets nuls (0x00) au
   milieu des chaînes!  L'UTF-8 n'utilise aucun octet nul précisément
   pour cette raison.  La chaîne suivante contient des caracatères non
   ASCII encodés en UTF-8 qui se retrouvera telle quelle dans le
   fichier exécutable, donc, à l'exécution, le terminal doit être en
   UTF-8 sinon on verra des caractères bizarres. */

static const char* literal = "Chaîne encodée en UTF-8 dans le source";

void main() { ... }

/*
Local variables:
c-basic-offset: 2
coding: utf-8
eval: (c-set-offset 'substatement-open 0)
End:
*/

-- Emacs, go to -*- Ada -*- mode!

-- GNAT accepte les fichiers sources encodés en UTF-8 à condition de
-- le lui demander gentiment: -gnatiw permet les caractères non-ASCII
-- dans le source aussi bien pour les identificateurs que pour les
-- chaînes littérales, et -gnatW8 spécifie l'encodage UTF-8.

with Ada.Text_IO; use Ada.Text_IO;
procedure Pépé is
begin
   Put_Line ("Pépé");
end Flurb;

-- Local variables:
-- coding: utf-8
-- ada-language-version: ada95
-- ada-prj-default-comp-opt: -gnatafoy -g -O2 -gnatiw -gnatW8
-- End:

Et, bien sûr, tu peux mettre ces commentaires dans un fichier README
sans aucune syntaxe particulière.
  
> > Tu peux convertir un fichier ISO-8859-1 en UTF-8 avec la commande
> > suivante :
> > 
> > recode Latin-1..UTF-8 fichier
> Pas cool, elle n'est pas installée, 'faudra d'abord que je trouve dans quel
> package c'est, puis je testerai :)

recode-3.6-4, sur ma Red Hat 7.3 au bureau.

Tu peux aussi changer l'encodage depuis emacs:

M-x set-buffer-file-coding-system (ou C-x RET f) utf-8,
puis C-x C-s pour enregistrer avec le nouvel encodage.
  
> > Au fait, c'est normal que ça marche dans xemacs : il utilise des
> > heuristiques pour deviner l'encodage en examinant chaque octet du
> > fichier...
> Emacs m'épatera toujours :) 

Oui.  Il N'y A Q'Un Seul Editeur :)

-- 
Ludovic Brenta.





Plus d'informations sur la liste de diffusion Linux-bruxelles