[Gnome terminal] codage des caractères

Fermé
bobo - 15 avril 2006 à 14:33
 bobo - 18 avril 2006 à 00:46
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 ?
A voir également:

16 réponses

up
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.
1
pas d'idée ?
0
Personne sait pourquoi certains caractères ne sont pas affichés ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2006 à 23:03
Salut,

Ton problème de caractères est-il lié au pages de "man" ?
0
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2006 à 23:17
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
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
15 avril 2006 à 23:50
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2006 à 23:58
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
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
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
16 avril 2006 à 20:00
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
17 avril 2006 à 07:48
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
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