Cette page contient des informations sur les problèmes liées aux locales. Dans les paragraphes suivants, vous trouverez un aperçu générique de ceux qui peut vous arriver lors de la configuration de votre système pour diverses locales. Beaucoup (mais pas tous) de problèmes existants liés aux locales peuvent être classés et catégorisés sous une des en-têtes ci-dessous. Les niveaux de sévérité indiqués ci-dessous utilisent les critères suivants :
Critique : Le programme ne remplit pas sa fonction principale. Une correction serait ennuyeuse, il vaut mieux chercher un remplaçant.
Haute: Une partie des fonctionnalités fournies par le programme n'est pas utilisable. Si cette fonctionnalité est exigée, il vaut mieux chercher un remplaçant.
Basse: Le programme fonctionne dans tous les cas d'utilisation classiques, mais il manque de certaines fonctionnalités normalement fournies par ses équivalents.
Si un moyen spécifique de contournement existe pour un paquet spécifique, il apparaîtra sur la page de ce paquet. Pour les informations les plus récentes sur les problèmes liés aux locales pour des paquets individuels, vérifiez les Notes utilisateur sur le Wiki de BLFS.
Sévérité : Critique
Certains programmes exigent que l'utilisateur spécifie l'encodage
de caractères pour leurs données d'entrée et de sortie et ils ne
présentent qu'un choix limité d'encodages. C'est le cas de l'option
-X
d'a2ps-4.14 et de Enscript-1.6.4, de l'option -input-charset
de Cdrtools-2.01 non corrigé et des encodages
offerts pour l'affichage du menu de Links-2.4. Si
l'encodage désiré n'est pas dans la liste, le programme devient en
général totalement inutilisable. Pour les programmes non
interactifs, on peut contourner cela en convertissant le document
dans un encodage d'entrée supporté avant de le soumettre au
programme.
Une solution à ce type de problème consiste à implémenter le support nécessaire de l'encodage manquant avec un correctif de du programme d'origine (comme on fait pour Cdrtools-2.01 dans ce livre), ou de chercher un remplaçant.
Sévérité : Haute pour des documents non textes, basse pour des documents texte
Certains programmes, nano-2.1.10 ou JOE-3.7 par exemple, supposent que les documents sont toujours dans l'encodage impliqué par la locale actuelle. Si cette supposition peut être valide pour les documents créés par l'utilisateur, ce n'est pas sûr pour ceux externes. Quand cette supposition échoue, les caractères non ASCII s'affichent mal et le document peut devenir illisible.
Si le document externe est entièrement basé sur du texte, il peut être converti dans l'encodage de la locale actuelle en utilisant le programme iconv.
Pour les documents non basés sur du texte, ce n'est pas possible. En fait, la supposition du programme peut être complètement invalide pour les documents où le système d'exploitation Microsoft Windows a de facto réglé les standards. AUn exemple de ce problème réside dans les drapeaux ID3v1 des fichiers MP3 (voir la page ID3v1Coding du Wiki BLFS pour plus de détails). Dans ces cas-là, la seule solution est de trouver un programme remplaçant qui n'a pas le problème (comme un qui vous permettra de spécifier l'encodage supposé du document).
Au sein des paquets BLFS, ce problème s'applique à nano-2.1.10, JOE-3.7 et à tous les players multimédias, sauf Audacious-3.1.
Un autre problème dans cette catégorie est quand on ne peut pas lire les documents qu'on vous a envoyés car leur système d'exploitation a réglé pour gérer différemment les encodages de caractères. Cel peut se produire souvent quand l'autre personne utilise Microsoft Windows, qui ne fournit qu'un encodage de caractère par pays donné. Par exemple, cela pose des problèmes avec les documents TeX encodés en UTF-8 créés sous Linux. Sur Windows, la plupart des applications supposeront que ces documents ont été créés en utilisant l'encodage 8 bits de Windows par défaut. Voir la page teTeX du Wiki pour plus de détails.
Dans les cas extrêmes, les problèmes de compatibilité d'encodages de Windows ne peuvent être résolus qu'en lançant des programmes Windows sous Wine.
Sévérité : Critique
Le standard POSIX dispose que l'encodage des noms de fichiers est
l'encodage impliqué par la catégorie de locale LC_CTYPE actuelle.
Ces informations sont bien cachées sur la page qui spécifie le
comportement des programmes Tar et
Cpio. Certains programmes ne le
font pas par défaut (ou n'ont tout simplement pas assez
d'informations pour le faire). Il en résulte qu'ils créent des noms
de fichiers qui sont ensuite mal affichés par ls, ou ils refusent d'accepter
des noms de fichiers affichés correctement par ls. Pour la bibliothèque
GLib-2.30.1, on peut corriger le prkbème en
réglant la variable d'environnement G_FILENAME_ENCODING
sur la valeur spéciale
"@locale". Les programmes basés sur Glib2 qui ne respectent pas cette variable
d'environnement sont bogués.
Zip-3.0, UnZip-6.0 ont ce problème car ils ont en dur l'encodage accepté du nom de fichier. UnZip contient en dur une table de conversion entre les encodages CP850 (DOS) et ISO-8859-1 (UNIX) et il utilise cette table lorsqu'il extrait des archives créées sous DOS ou Microsoft Windows. Cette supposition ne marche cependant que pour les États-Unis et pas pour tous ceux qui utilisent une locale UTF-8. Les caractères non ASCII seront rognés dans les noms de fichiers extraits.
La règle générale pour éviter ce type de problème est d'éviter d'installer des programmes cassés. Si c'est impossible, vous pouvez utiliser l'outil convmv en ligne de commande pour corriger les noms de fichiers créés par ces programmes cassés, ou rogner volontairement les noms de fichiers existants pour satisfaire les présupposés cassçs de tels programmes.
Dans d'autres cas, un problème similaire vient de l'importation de noms de fichiers d'un système utilisant une locale différente avec un outil non conscient de la locale (comme OpenSSH-5.9p1). Pour éviter de rogner les caracùres non ASCII lors du transfert de fichiers vers un système ayant une locale différente, vous pouvez utiliser une des méthodes suivantes :
Transférer malgré tout, réparer les dommages avec convmv.
Côté expéditeur, créer une archive tar en passant le
paramètre --format=posix
à tar (cela sera le réglage
par défaut dans une version à venir de tar).
Envoyer les fichiers en pièces jointes d'un message électronique. Les clients de messagerie spécifient l'encodage des noms de fichiers joints.
Écrire les fichiers sur un disque amovible formaté avec un système de fichiers FAT ou FAT32.
Transférer les fichiers en utilisant Samba.
Transférer les fichiers par FTP en utilisant un serveur (cela signifie actuellement seulement wu-ftpd, qui a une mauvaise histoire question sécurité) et un client conscients RFC2640 (comme lftp).
Les quatre dernières méthodes fonctionnent car les noms de fichiers sont automatiquement convertis de la locale de l'expéditeur en UNICODE et stockés ou envoyés sous cette forme. Ils sont alors convertis de façon transparente d'UNICODE dans l'encodage de la locale du destinataire.
Sévérité : Haute ou critique
De nombreux programmes ont été écrits dans une ère ancienne où les locales multioctets n'étaient pas courantes. De tels programmes supposent que les types de données C "char", qui sont un des octets, peuvent être utilisés pour stocker des caractères uniques. Au surplus, ils supposent que n'importe quelle séquence de caractères est une chaîne valide et que chaque caractère occupe une seule cellule de caractère. De telles suppositions échouent complètement dans les locales UTF-8. La manifestation visible est que le programme tronque les chaînes de façon prématurée (c'est-à-dire (aux octets 80 au lieu des caractères 80). Les programmes basés sur le terminal ne mettent pas bien le curseur à l'écran, ils ne réagissent pas à la touche "Effacement" en effaçant un caractère et ils laissent les caractères camelotes (junk) affiché lors du rafraîchissement de l'écran, transformant généralement l'écran en désordre complet.
La correction de ce type de problème est une tâche pénible du point de vue d'un programmeur, comme tout cas de modernisation d'un design défectueux par de nouveaux concepts. Dans ce cas, il faut reconcevoir toutes les structures de données pour s'accomoder du fait qu'un caractère complet peut s'étendre sur un nombre variable de "char"s (ou basculer sur wchar_t et convertir comme nécessaire). Pour chaque appel aux fonctions "strlen" et équivalent, il faut aussi trouver ce que voulait vraiment dire un nombre d'octets, de caractères ou la largeur de la chaîne. Il est parfois plus rapide d'écrire depuis zéro un programme ayant la même fonctionnalité.
Au sein des paquets de BLFS, ce problème s'applique à xine User Interface-0.99.6 et tous les shells.
Sévérité : basse
LFS s'attend à ce que les pages de manuel soient dans l'encodage spécifique à la langue (en général 8-bit), comme indiqué sur la page Man DB de LFS. Cependant, certains paquets installent des pages de manuel traduites dans l'encodage UTF-8 (comme Shadow, déjà traité), ou des pages de manuel dans des langues non présentes dans la table. Tous les paquets BLFS n'ont pas fait l'objet d'une évaluation de leur respect des exigences de LFS (la grande majorité a été vérifiée et des corrections ont été mises dans le livre pour les paquets connus pour installer des pages de manuel non conformes). Si vous trouvez une page de manuel installée par un paquet BLFS qui est dans un mauvais encodage, merci de la supprimer ou de la convertir selon vos besoins et de le signaler à l'équipe BLFS comme un bogue.
Vous pouvez facilement vérifier le respect par toutes les pages de man de votre système en copiant le petit script shell suivamt à un endroit accessible,
#!/bin/sh
# Début de checkman.sh
# Usage : find /usr/share/man -type f | xargs checkman.sh
for a in "$@"
do
# echo "Checking $a..."
# Page de manuel Pur ASCII (sauf éventuellement les commentaires) est bonne
grep -v '.\\"' "$a" | iconv -f US-ASCII -t US-ASCII >/dev/null 2>&1 \
&& continue
# Page de manuel Non UTF-8 est bonne
iconv -f UTF-8 -t UTF-8 "$a" >/dev/null 2>&1 || continue
# Si arrivé là, on a trouvé une page de man en UTF-8, mauvais.
echo "UTF-8 manual page: $a" >&2
done
# Fin de checkman.sh
puis en lançant la commande suivante (modifiez la commande
ci-dessous si le script checkman.sh n'est pas dans votre
variable d'environnement PATH
) :
find /usr/share/man -type f | xargs checkman.sh
Remarquez que si vous avez des pages de manuel installées ailleurs
que dans /usr/share/man
(comme dans
/usr/local/share/man
), vous devez
modifier la commande ci-dessus pour inclure cet emplacement
supplémentaire.
Last updated on 2011-11-09 18:37:35 +0100