[Gnome terminal] codage des caractères

Bonjour
Je suis sous Mandriva 2006 et j'ai un petit problème avec le Gnome terminal :

Premièrement j'aimerais que le codage UTF-8 (unicode) soit celui utilisé par défaut. Or, dès que je relance le terminal, il me remet un autre codage qui n'affiche pas bien les caractères.

Enfin, même avec le codage UTF-8, certains caractères tels que é ou à sont remplacés par des carrés. Mais je crois que ça ne le fait pas sur tous les documents.

Y a t-il quelque chose à faire ?

16 réponses

  1. Merci beaucoup ça marche !
    par contre j'ai dû repasser en ISO 88-59 (au lieu de UTF-8 car en UTF-8 j'ai toujours des carrés à la place des caractères accentués) et le résultat des commandes s'affiche mal. Par exemple :
    $ ls dfkdfjdfjkdfdf
    ls dfkdfjdfjkdfdf : Aucun fichier ou répertoire de ce type

    Pour convertir tous les fichiers, je vais essayer ce script, si j'endommage des fichiers je les restaurerai, je l'ai déjà fait une fois c'est pas grave.

    for fichier in `find /usr/share/man/fr/ -name '*.bz2'`; do
    bzip2 -dc $fichier | perl man4utf8.pl | gzip -c > `dirname $fichier`/`basename $fichier bz2`gz
    done
    0
    1. Modérateur
      Re,

      Correction pour le message précédent

      AFFICHAGE DE PAGES MAN QUI CONTIENT DES CARACTÈRES CODÉE SUR 2 OCTETS

      DESCRIPTION

      L'exécution du man [ commande ] affiche à la place des caractères avec accents des caractères bizarroïdes.

      Ex : man find
      NOM
             find - Rechercher des fichiers dans une hiérarchie de répertoires.
      
      SYNOPSIS
             find [chemin...] [expression]
      
      DESCRIPTION
             Cette  page  de manuel documente la version GNU de find.  find parcourt
             les arborescences de répertoires commençant  en  chacun  des  chemins
             mentionnés,  en évaluant les expressions fournies pour chaque fichier
             rencontré.  L'évaluation de l'expression se fait de gauche à droite,
             en   suivant  des  règles  de  priorité  décrites  dans  la  section
             OPÃRATEURS, jusqu'à  ce que le résultat soit  connu  (par  exemple  la
             partie  gauche vraie pour un opérateur OU ou fausse pour un opérateur
             ET).
      L'affichage de caractères ayant le code ASCII plus grand que 127 sont codées sur plusieurs octets.

      Les bits du point fort du 1er octet et formé d'une suite de 1 avec
      une longueur égale avec le nombre d'octets utilisé pour coder le caractère.

      0XXXXXXX un octet codé de 1 à 7 bits
      110XXXXX10XXXXXX 2 octets codés de 8 à 11 bits
      Etc.

      Prenons le cas de é
      - le caractère é est codé 233 en ASCII étendu - 1101001
      - en utf8 sur 2 octets 11000011 1001001

      233 -> 1101001 -> utf8 -> 11000011 1001001 -> 195169

      Donc dans le script les caractères qu'ont le code plus grand que 127
      je les transforme sous la forme de 2 octets (binaire) ensuite j'enlève
      les bits de point fort en le transformant dans la présentation binaire
      sur 1 octet et je convertit la code en caractère.

      UTILISATION
      [root@localhost ~]# bzip2 -dc /usr/share/man/fr/man1/find.1.bz2  | perl man4utf8.pl | gzip -c > /usr/share/man/fr/man1/find.1.gz
      RESULTAT
      [root@localhost ~]# man find
      FIND(1L)                 Manuel de l'utilisateur Linux                FIND(1L)
      
      NOM
             find - Rechercher des fichiers dans une hiérarchie de répertoires.
      
      SYNOPSIS
             find [chemin...] [expression]
      
      DESCRIPTION
             Cette  page  de manuel documente la version GNU de find.  find parcourt
             les arborescences de répertoires commençant en chacun des chemins  men-
             tionnés,  en évaluant les expressions fournies pour chaque fichier ren-
             contré.  L'évaluation de l'expression se fait de gauche  à  droite,  en
             suivant  des  règles  de  priorité décrites dans la section OPÉRATEURS,
             Jusqu'à ce que le résultat soit connu (par  exemple  la  partie  gauche
             vraie pour un opérateur OU ou fausse pour un opérateur ET).


      LE SCRIPT
      #! /usr/bin/perl
      #
      use warnings;
      use strict;
      
      my $p1=110_000;
      my $p2='10';
      my %utf8;
      
      sub dec2bin{
      	my $dec = unpack("B32",pack("N",shift));
      	$dec =~ s/^0+(\d+)/$1/;
      	return $dec;
      }
      
      sub bin2dec{
      	return (unpack("N",pack("B32",substr("0" x 32 . shift,-32))));
      }
      
      my @t=map { dec2bin($_) } 128..255;
      
      foreach(@t){
      	my $v = bin2dec($_);
      	my $utf8 = $p1 . substr($_,0,2) . $p2 . substr($_,2);
      	my $cle = bin2dec(substr($utf8,0,8)).bin2dec(substr($utf8,-8));
      	$utf8{$cle} = $v;
      }
      
      while (my $ligne = <>){
      	$ligne =~ s/([\x80-\xDF])/ord($1)/eg;
      	foreach my $c (keys %utf8){
      		$ligne =~ s/$c/chr($utf8{$c})/eg;
      	}
      	print $ligne;
      }
      COMMENTAIRES

      Testé sur Mandriva 2006
      [root@localhost ~]# uname -pros
      Linux 2.6.12-12mdksmp AMD Turion(tm) 64 Mobile Technology MT-32 GNU/Linux


      Les fichiers man avec le format .bz2 ( compressé avec bzip2 )

      La commande : bzip2 -dc /usr/share/man/fr/man1/find.1.bz2 | perl man4utf8.pl | gzip -c > /usr/share/man/fr/man1/find.1.gz

      1ère partie : bzip2 -dc /usr/share/man/fr/man1/find.1.bz2

      Décompression sur STDOUT du fichier man

      2ème partie : perl man4utf8.pl

      Le script Perl peut être exécuté aussi de la manière /chemin/vers/man4utf8.pl
      mais dans ce cas il faut accordé les droit d'exécution : chmod 0755 /chemin/vers/man4utf8.pl

      Le résultat de la 1ère partie est lue et traitée par la commande de la 2ème partie

      3ème partie : gzip -c > /usr/share/man/fr/man1/find.1.gz

      La 3ème partie compresse(avec gzip) depuis STDOUT le résultat du script

      UNE AUTRE FACON DE LE FAIRE

      - création d'un fichier man temporaire
      [root@localhost ~]# bzip2 -dc /usr/share/man/fr/man1/mkdir.1.bz2 | perl man4utf8.pl | bzip2 -c > /usr/share/man/fr/man1/mkdir_.1.bz2

      - remplacer l'original
      [root@localhost ~]# mv /usr/share/man/fr/man1/mkdir_.1.bz2 /usr/share/man/fr/man1/mkdir.1.bz2
      mv: écraser `/usr/share/man/fr/man1/mkdir.1.bz2'?y

      - affichage
      [root@localhost ~]# man mkdir

      SECURITE

      Normalement c'est bien de travailler sur une copie de fichier, en gardant l'original intact.
      Cependant les pages man peuvent être toujours réinstallés avec le gestionnaire de paquetages de votre distribution.

      lami20j
      0
      1. Modérateur
        Re,

        Je reviens sur ce sujet puisque j'ai pensée à une autre possibilté que la manipulation avec les script que tu as trouvé sur le site donné par jipicy.

        Je ne me suis pas trop cassé la tête pour trouver pourquoi, en revenche j'ai écrit un script (un decodeur) qui te permetras lire tes pages man avec les caractères français sans rien modifier.

        Explications

        Quand on voit un texte :

        DESCRIPTION
        La commande ls affiche tout d'abord l'ensemble de ses arguments
        fichiers autres que des répertoires. Puis ls affiche l'ensemble des
        fichiers contenus dans chaque répertoire indiqué. Si aucun argument-

        L'affichage de caractères ayant le code ASCII plus grand que 127 sont codées sur plusieurs octets.

        Les bits du point fort du 1er octet et formé d'une suite de 1 avec une longueur égale avec le nombre d'octets utilisé pour coder le caractère.

        0XXXXXXX un octet codé de 1 à 7 bits
        110XXXXX10XXXXXX 2 octets codés de 8 à 11 bits
        etc.

        Prénons le cas de é
        - le caractère é est codé 233 en ASCII étendu - 1101001
        - en utf8 sur 2 octets 11000011 1001001

        233 -> 1101001 -> utf8 -> 11000011 1001001 -> 195169

        Donc dans le script tu les caractères qu'ont le code plus grand que 127 je les transforme sous la forme de 2 octets (binaire) ensuite j'enlève les bits de point fort en le transformant dans la présentation binaire sur 1 octet et je convertit la code en caractère.

        Voilà le script
        #! /usr/bin/perl
        #
        use warnings;
        use strict;
        
        my $p1=110000;
        my $p2='10';
        my %utf8;
        
        sub dec2bin{
                my $dec = unpack("B32",pack("N",shift));
                $dec =~ s/^0+(\d+)/$1/;
                return $dec;
        }
        
        sub bin2dec{
                return (unpack("N",pack("B32",substr("0" x 32 . shift,-32))));
        }
        
        my @t=map { dec2bin($_) } 128..255;
        
        foreach(@t){
                my $v = bin2dec($_);
                my $utf8 = $p1 . substr($_,0,2) . $p2 . substr($_,-6);
                my $cle = bin2dec(substr($utf8,0,8)).bin2dec(substr($utf8,-8,8));
                $utf8{$cle} = $v;
        }
        
        while (my $ligne = <>){
                $ligne =~ s/(.)/ord($1)>127?ord($1):$1/eg;
                foreach my $c (keys %utf8){
                        $ligne =~ s/$c/chr($utf8{$c})/eg;
                }
                $ligne =~s/195/à/g;# j'ai ajouté pour à, je n'ai pas cherché pourqoui à n'est pas traité
                print $ligne;
        }
        
        Le résultat - avant
        [lami20j@localhost ~]$ man cp
        
        CP(1)                    Manuel de l'utilisateur Linux                   CP(1)
        
        NOM
               cp - Copier des fichiers et des répertoires.
        
        SYNOPSIS
               cp [options] fichier chemin
               cp [options] fichier... répertoire
        
               Options POSIX : [-fiprR] [--]
        
               Options POSIX 1003.1-2003 supplémentaires : [-HLP]
        
               Options GNU file-utils 4.0 (forme courte) :
               [-abdfilprsuvxPR]    [-S   SUFFIXE]   [-V   {numbered,existing,simple}]
               [--backup=CONTROL] [--sparse=QUAND] [--help] [--version] [--]
        
               Options GNU file-utils 4.1 supplémentaires (forme courte) :
               [-HLP]     [--copy-contents]     [--no-preserve]      [--reply=COMMENT]
               [--remove-destination]    [--strip-trailing-slashes]   [--target-direc-
               tory=RÃP]
        
        DESCRIPTION
               cp sert à copier des fichiers (et éventuellement  des  répertoires).
               On  peut  aussi  bien  copier  un  fichier  donné vers une destination
               précise que copier un ensemble de fichiers dans un répertoire.
        
               Si le dernier argument correspond à un nom de  répertoire,  cp  copie
               dans ce répertoire chaque fichier indiqué en conservant le même nom.
        
               Sinon, s'il n'y a que deux fichiers indiqués, il copie le premier  sur
               le second.
        
               Une  erreur se produit si le dernier argument n'est pas un répertoire,
               et si plus de deux fichiers sont indiqués. Par défaut, on  n'effectue
               pas la copie de répertoires.
        
               Ainsi,  si  /a  est  un répertoire, alors « cp -r /a /b » copiera /a
               dans /b/a et /a/x dans /b/a/x au cas où  /b  existe  déjà ,  mais  il
               copiera /a sur /b et /a/x dans /b/x si /b n'existait pas encore. Enfin,
               si /b était un fichier ordinaire, la copie échouera.
        
        Le résultat filtré par le script
        [lami20j@localhost ~]$ man cp | utf8_accent.pl | less
        CP(1)                    Manuel de l'utilisateur Linux                   CP(1)
        
        
        
        NOM
               cp - Copier des fichiers et des répertoires.
        
        SYNOPSIS
               cp [options] fichier chemin
               cp [options] fichier... rà169pertoire
        
               Options POSIX : [-fiprR] [--]
        
               Options POSIX 1003.1-2003 supplémentaires : [-HLP]
        
               Options GNU file-utils 4.0 (forme courte) :
               [-abdfilprsuvxPR]    [-S   SUFFIXE]   [-V   {numbered,existing,simple}]
               [--backup=CONTROL] [--sparse=QUAND] [--help] [--version] [--]
        
               Options GNU file-utils 4.1 supplémentaires (forme courte) :
               [-HLP]     [--copy-contents]     [--no-preserve]      [--reply=COMMENT]
               [--remove-destination]    [--strip-trailing-slashes]   [--target-direc-
               tory=RàP]
        
        
        DESCRIPTION
               cp sert à  copier des fichiers (et éventuellement  des  répertoires).
               On  peut  aussi  bien  copier  un  fichier  donné vers une destination
               précise que copier un ensemble de fichiers dans un répertoire.
        
               Si le dernier argument correspond à  un nom de  répertoire,  cp  copie
               dans ce répertoire chaque fichier indiqué en conservant le même nom.
        
               Sinon, s'il n'y a que deux fichiers indiqués, il copie le premier  sur
               le second.
        
               Une  erreur se produit si le dernier argument n'est pas un répertoire,
               et si plus de deux fichiers sont indiqués. Par défaut, on  n'effectue
               pas la copie de répertoires.
        
               Ainsi,  si  /a  est  un répertoire, alors « cp -r /a /b » copiera /a
               dans /b/a et /a/x dans /b/a/x au cas où  /b  existe  déjà ,  mais  il
               copiera /a sur /b et /a/x dans /b/x si /b n'existait pas encore. Enfin,
               si /b était un fichier ordinaire, la copie échouera.
        
        lami20j
        0
        1. re

          j'ai fait des tests avec cat :
          si le fichier est UTF-8 : pas de problème, cat affiche correctement.
          si c'est un autre type (ISO88xx) -> tous les caractères accentués sont mal affichés.

          Par exemple, pour le fichier useradd.8
          par défaut il est de type troff or preprocessor input text
          voici la fin du fichier affiché avec cat :
          "N'h\uffffsitez pas \uffff signaler \uffff l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
          "

          si je supprime le début du fichier useradd.8, il est détecté comme UTF-8 et le reste du fichier, y compris les accents, s'affichent correctement :
          "N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel."

          C'est quand même incroyable, qu'est-ce qu'il ne faut pas faire juste pour afficher du texte. A croire que Linux est fait exclusivement pour supporter l'affichage anglophone.

          Enfin bon, si quelqu'un a une solution...
          0
          1. Alors dans le fichier cat.1 il y a marqué ceci :

            Equivalent à (avec un accent aigu sur le E)

            si je fais cat cat.1 -> pas de problème ça m'affiche les caractères correctement
            par contre si je fais man cat -> carré à la place du E et du à. Donc je suppose que le problème vient de man...et qu'il n'y a rien à faire.
            Vous en pensez quoi ?
            0
            1. Re
              j'ai lancé le script mais ça na rien créé, pas de répertoire /tmp/man
              Ce problème survient aussi quand un fichier comprend un caractère accentué dans son nom, mais seulement pour des fichiers créés automatiquement, quand je crée un fichier moi même il n'y a pas de problème.
              0
              1. Modérateur
                Re-

                Veille bien à changer la ligne de script comme suggérer dans le second lien.

                De toutes façons les pages modifiées sont copiées dans "/tmp/man/" (le script quant à lui est lancé par un "$USER" normal).
                Ce n'est qu'une fois les pages modifiées, et les pages comprenant des erreurs supprimées, qu'en tant que "root" tu copies les pages dans le répertoire : "/usr/share/man/fr".
                0
                1. Salut lamij, merci du conseil ;-)

                  En exécutant draklocale j'ai pu choisir l'unicode comme codage par défaut, c'est déjà ça de fait.

                  Je vous redonne des nouvelles.
                  0
                  1. Modérateur
                    Salut,

                    mais j'ai peur que ça bousille les pages de man.
                    Exécute le script sur des copies. Comme ça tu ne bousilles rien du tout.

                    Il faut toujours garder les originaux.

                    lami20j
                    0
                    1. effectivement, dans les pages de man quand ce n'est pas en unicode j'ai des caractères de ce genre : é
                      Ãquivalent à -vET.

                      en Unicode ça donne ça :
                      \uffffquivalent \uffff -vET.

                      (les \uffff s'affichent comme des carrés)

                      Je vais essayer le script donné sur le site, mais j'ai peur que ça bousille les pages de man.
                      Enfin, qui ne tente rien n'a rien !
                      0
                      1. Modérateur
                        Re-

                        Je demandais pour les pages de "man" à cause de ça :
                        http://forum.mandrivaclub.com/viewtopic.php?t=44098&highlight=man+caract%E8re
                        http://forum.mandrivaclub.com/viewtopic.php?t=43320&highlight=

                        Sinon, pour l'Unicode c'est surement dans les préférences et paramètres à enregistrés de "Gnome-terminal" que ça se passe... désolé mais j'emploie Konsole.
                        0
                        1. Salut
                          En fait c'est assez spécial : quand j'écris un caractère spécial (é, à...) il s'affiche correctement mais des fois, que ce soit dans une page de man ou le résultat d'une commande, ça m'affiche des caractères erronés.

                          Et à propos du codage par défaut, est-ce que tu as une idée de pourquoi ce n'est pas unicode qui est choisi ?

                          Merci
                          0
                          1. Modérateur
                            Salut,

                            Ton problème de caractères est-il lié au pages de "man" ?
                            0
                            1. Personne sait pourquoi certains caractères ne sont pas affichés ?
                              0