Forum Linux.embarqué Problème encodage et ls

Posté par  (site Web personnel) . Licence CC By‑SA.
Étiquettes :
1
29
juil.
2019

Bonjour,

J'ai un léger problème avec mon mini-NAS. J'essaye d'en créer un à partir d'un Odroid-HC1.
Ça marche très bien.

Bon par-contre, j'ai un problème assez perturbant lié à ls et à ranger (mon gestionnaire de fichiers).
La commande ls m'affiche bizarrement tous les caractères unicode.
Le reste du système gère correctement l'ensemble des caractères. echo Éh ! fonctionne correctement.

Le pire dans cette histoire, c'est que même les émojis fonctionnent.
Par exemple, j'ai un fichier sur le disque interne nommé 👍 (oui c'est son nom).

La commande ls m'affiche : ''$'\360\237\221\215.

La commande ls -b m'affiche : \360\237\221\215.

Par-contre, c'est là que ça devient n'importe-quoi. ls | cat m'affiche 👍.

Selon moi, ls agit différemment en fonction du type de sortie et quand il affiche dans le terminal il ne gère pas l'unicode.

$ locale
LANG=fr_FR.UTF-8
LANGUAGE=fr_FR:fr
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C

Ça fait beaucoup de "C" à mon goût mais il me semble que c'est une valeur qui ne pose pas problème.

Vous avez une idée de l'origine du problème ?
C'est perturbant à l'usage mais ne pose pas de problème important.
Merci ^

ache

  • # LC_ALL, LC_CTYPE

    Posté par  (site Web personnel) . Évalué à 4.

    La variable LC_ALL prend le pas sur tout le reste…

    Sur un environnement configuré en anglais britannique et en UTF-8 :

    $ locale
    LANG=en_GB.UTF-8
    LANGUAGE=
    LC_CTYPE="en_GB.UTF-8"
    LC_NUMERIC="en_GB.UTF-8"
    LC_TIME="en_GB.UTF-8"
    LC_COLLATE="en_GB.UTF-8"
    LC_MONETARY="en_GB.UTF-8"
    LC_MESSAGES="en_GB.UTF-8"
    LC_PAPER="en_GB.UTF-8"
    LC_NAME="en_GB.UTF-8"
    LC_ADDRESS="en_GB.UTF-8"
    LC_TELEPHONE="en_GB.UTF-8"
    LC_MEASUREMENT="en_GB.UTF-8"
    LC_IDENTIFICATION="en_GB.UTF-8"
    LC_ALL=
    

    il suffit de positionner LC_TIME=C pour reproduire le problème d'affichage par ls.

    Plus d'infos sur https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html. Extrait :

    LC_CTYPE
        Character classification and case conversion.
    

    Ne pas toucher à LC_TIME mais positionner LC_ALL=C produit le même effet, vu l'override mentionné au début.

    Debian Consultant @ DEBAMAX

    • [^] # Re: LC_ALL, LC_CTYPE

      Posté par  (site Web personnel) . Évalué à 1. Dernière modification le 30/07/19 à 05:27.

      Merci, c'est effectivement ça.

      Je ne comprend pas trop pourquoi dpkg n'a pas fait son travail tout seul.

      LC_ALL=C est dans /etc/environment par défaut semble-t-il.

      $ cat /etc/environment
      ARCH=arm
      LC_ALL=C

      Il y a certainement une raison mais je ne capte pas l’intérêt d'avoir ça. Bref, en supprimant la ligne de LC_ALL, tout rentre dans l'ordre.

      Merci bien ! Bonne journée ^

      • [^] # Re: LC_ALL, LC_CTYPE

        Posté par  (site Web personnel) . Évalué à 1.

        Je ne vois pas trop le rapport avec dpkg. Si tu es sur une distribution (basée sur) Debian, c'est l'installation et la configuration du paquet locales qui permettent de jouer sur le contenu des fichiers /etc/environment et /etc/default/locale. Sur le même système que précédemment, /etc/environment est vide et le /etc/default/locale contient :

        #  File generated by update-locale
        LANG=en_GB.UTF-8
        LANGUAGE="en_GB:en"
        

        (Cf. dpkg-reconfigure locales pour changer la configuration et le contenu de ce fichier par effet de bord.)

        Le contenu que tu cites ressemble à une tentative de la personne qui a buildé ton image de faire disparaître toutes les warnings (notamment niveau Perl) concernant des locales non configurées, en positionnant cette variable une seule fois dans ce fichier. Ça devrait probablement ne pas rester dans ce fichier une fois l'image préparée… (Mais je joue aux devinettes, je peux me tromper… ;p)

        Debian Consultant @ DEBAMAX

  • # encodage

    Posté par  (site Web personnel) . Évalué à 2. Dernière modification le 30/07/19 à 22:04.

    Il reste quand même quelque chose de perturbant.
    Contrairement à cat qui va cracher ses octets tel que dans le terminal, ls va parser le nom du fichier à afficher et vérifier s'il peut l'afficher.
    Pour cela il utilise les fonctions de type mbrtowc ou wcwidth qui dépendent de LC_CTYPE pour la conversion.
    S'il n'y arrive pas, comme dans votre cas, il devrait afficher des ? (question mark) à la place.

    Pas le truc bizarre qui, remâché par cat,peut sortir un caractère correct …

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.