[Gnome terminal] codage des caractères

bobo -  
 bobo -
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. bobo
     
    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
  2. bobo
     
    Personne sait pourquoi certains caractères ne sont pas affichés ?
    0
  3. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Ton problème de caractères est-il lié au pages de "man" ?
    0
  5. bobo
     
    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
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  7. bobo
     
    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
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  9. bobo
     
    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
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  11. bobo
     
    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
  12. bobo
     
    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
  13. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  14. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  15. bobo
     
    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