URL: https://linuxfr.org/forums/linux-general/posts/less-demande-un-suffixe-pour-lire-utf8-et-le-lit-correctement-sans-en-fait-c-est-lesspipe-sh Title: less demande un suffixe pour lire utf8... et le lit correctement sans!? [en fait, c'est lesspipe.sh] Authors: FantastIX Date: 2022年05月02日T15:14:50+02:00 License: CC By-SA Tags: less et utf8 Score: 1 Bonjour. Sur mon installation Manjaro (elle est à jour, j'ai vérifié), je viens de constater que `less` me demande d'ajouter le suffixe '::' à un fichier texte utf-8:> ==> append :: to filename to view the utf-8 encoded file Je fais ça et effectivement, j'ai plus le message. Mais il le lit quand-même correctement sans ça...! [Heureusement qu'il ne me demande pas de courir tout nu dans le quartier en chantant "_The Great Pretender_", ma crédulité a ses limites.] Je suis allé faire un tour du côté de [StackOverflow](https://stackoverflow.com/questions/2114862) et j'ai vérifié les étapes données dans la [réponse](https://stackoverflow.com/a/2115027): ni '`LESSCHARSET=utf8 less `' ni '`LESSCHARSET=utf-8 less `' ne changent quoi que ce soit. J'ai vérifié mes "locales" et toutes sont en .utf8 (depuis le premier jour de l'installation, d'ailleurs): locale -a | grep fr_ fr_BE.utf8 fr_CA.utf8 fr_CH.utf8 fr_FR.utf8 fr_LU.utf8 Par acquit de conscience, j'ai ré-exécuté `locale-gen`, rien à faire: j'ai toujours le même message. Voici ce que j'ai: $ cat /etc/locale.conf LANG=fr_BE.utf8 LC_ADDRESS=fr_BE.utf8 LC_IDENTIFICATION=fr_BE.utf8 LC_MEASUREMENT=fr_BE.utf8 LC_MONETARY=fr_BE.utf8 LC_NAME=fr_BE.utf8 LC_NUMERIC=fr_BE.utf8 LC_PAPER=fr_BE.utf8 LC_TELEPHONE=fr_BE.utf8 LC_TIME=fr_BE.utf8 Noter que j'ai beau remplacer `utf8` par `UTF-8` et vice-versa (comme à l'installation), ça ne change strictement rien. Mais ce qui me surprend c'est que `less` affiche bien les accents et les caractères spéciaux... Je pige plus rien. C'est quoi son stress au p'tit `less`? ~~Si quelqu'un a une idée, je suis preneur.~~ **EDIT:** J'ai fini par trouver d'où vient le message et je pense avoir compris pourquoi il est affiché. Tout part de `/usr/bin/lesspipe.sh`, un script-à-tout-faire qui permet de visualiser à peu près n'importe quel fichier, pourvu qu'il y ait un décodeur pour ça. J'ai plus ou moins tracé le code jusqu'à la fonction `get_unpack_cmd` (ligne 271): ```sh get_unpack_cmd () { fchar="${1%:*}"; fchar="${fchar#*:}" fcat="${1##*:}" x="${1%%:*}" cmd= if [[ "3ドル" == $sep$sep ]]; then return fi declare t # uncompress / transform case $x in gzip|bzip2|lzip|lzma|xz|brotli|compress) # remember name of uncompressed file [[ 2ドル == - ]] || fileext="2ドル" fileext=${fileext%%.gz}; fileext=${fileext%%.bz2} [[ $x == compress ]] && x=gzip has_cmd $x && cmd=($x -cd "2ドル") && return ;; zstd) has_cmd zstd && cmd=(zstd -cdqM1073741824 "2ドル") && return ;; lz4) has_cmd lz4 && cmd=(lz4 -cdq "2ドル") && return ;; xlsx) has_cmd in2csv && cmd=(in2csv -f xlsx "2ドル") && return has_cmd excel2csv && cmd=(istemp excel2csv "2ドル") && return ;; ms-excel) has_cmd in2csv && cmd=(in2csv -f xls "2ドル") && return has_cmd xls2csv && cmd=(istemp xls2csv "2ドル") && return ;; esac # convert into utf8 if [[ -n $lclocale && $fchar != binary && $fchar != *ascii && $fchar != $lclocale && $fchar != unknown* ]]; then qm="033円[7m?033円[m" # inverted question mark rep=-c trans= echo ""|iconv --byte-subst - 2>/dev/null && rep="--unicode-subst=$qm --byte-subst=$qm --widechar-subst=$qm" # MacOS echo ""|iconv -f $fchar -t $locale//TRANSLIT - 2>/dev/null && trans="-t $locale//TRANSLIT" msg "append $sep$sep to filename to view the $fchar encoded file" cmd=(iconv $rep -f $fchar $trans "2ドル") # loop protection, just in case lclocale= return fi [[ "3ドル" == $sep ]] && return file2=${3#$sep} file2=${file2%%$sep*} # remember name of file to extract or file type [[ -n "$file2" ]] && fileext="$file2" # extract from archive rest1="$rest2" rest2= prog= case "$x" in tar) prog=tar has_cmd bsdtar && prog=bsdtar ;; rpm) { has_cmd cpio && has_cmd rpm2cpio; } || { has_cmd bsdtar; } && cmd=(isrpm "2ドル" "$file2") ;; java-archive|zip) { has_cmd bsdtar && prog=bsdtar; } || { has_cmd unzip && prog=unzip; } ;; debian*-package) { has_cmd ar || has_cmd bsdtar; } && cmd=(isdeb "2ドル" "$file2") ;; rar) { has_cmd bsdtar && prog=bsdtar; } || { has_cmd unrar && prog=unrar; } || { has_cmd rar && prog=rar; } ;; ms-cab-compressed) { has_cmd bsdtar && prog=bsdtar; } || { has_cmd cabextract && prog=cabextract; } ;; 7z-compressed) { has_cmd 7zr && prog=7zr; } || { has_cmd 7z && prog=7z; } || { has_cmd 7za && prog=7za; } ;; iso9660-image) { has_cmd bsdtar && prog=bsdtar; } || { has_cmd isoinfo && prog=isoinfo; } ;; archive) prog=ar has_cmd bsdtar && prog=bsdtar esac [[ -n $prog ]] && cmd=(isarchive $prog "2ドル" "$file2") if [[ -n $cmd ]]; then [[ -n "$file2" ]] && file2= && return msg "use ${x}_file${sep}contained_file to view a file in the archive" has_cmd archive_color && colorizer=archive_color || colorizer=cat fi } ``` C'est le test de la ligne 301 qui génère le message: if [[ -n $lclocale && $fchar != binary && $fchar != *ascii && $fchar != $lclocale && $fchar != unknown* ]] Le premier paramètre passé à la fonction est un triplet dont le séparateur est le double point (':'). L'élément médian identifie le type de fichier à afficher. En gros le test dit ceci: * si le paramètre régional existe ET * si le type de fichier n'est pas binaire ET * si le type de fichier n'est pas ASCII' ET * si le paramètre régional (`$lclocale`) est différent du type de fichier (`$fchar`) ET * si le format de fichier n'est pas inconnu, * ALORS afficher un message d'avertissement. Le seul souci c'est que mon paramètre régional est détecté comme '`utf8`' et le type de fichier comme '`utf-8`'! Et comme les deux sont lexicalement différents, le message est affiché. Mais bon, ce script est totalement imbitable (en outre, du code pissé par blocs sans une seule ligne de commentaire expliquant ce qui s'y passe), j'ai pas trop envie de mettre les doigts dedans et de casser quelque chose. Je vais probablement adresser un avis de bug à ma distribution préférée, qui transmettra au mainteneur, je présume.

AltStyle によって変換されたページ (->オリジナル) /