21 votes

Comment saisir des caractères spéciaux pour que Bash/Terminal les comprenne ?

Disons qu'un dossier contient un fichier appelé Näyttökuva.png (pour ceux qui sont intéressés, c'est "screenshot" en finnois). Voici ce qui se passe :

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

$ ls Nä*
ls: Nä*: No such file or directory

Cela affecte également l'auto-complétion des onglets. Si je commence à taper ls N et appuyez sur tab il est correctement étendu à ls Näyttökuva.png . Mais si je commence à taper ls Nä La tabulation ne fait rien.

Comment puis-je soit :

  • configurer bash/terminal pour qu'il comprenne les caractères spéciaux
  • tapez les caractères spéciaux pour que bash/terminal les comprenne ?

Dans le Terminal, l'encodage est réglé sur UTF-8 dans l'onglet Paramètres et l'onglet Encodage est dans son état par défaut, c'est-à-dire UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep + certains codages asiatiques sont activés.


Encore plus étrange (mais probablement pas essentiel pour la question) :

Si je tape ls N , appuyez sur tab supprimez des caractères à partir de la fin jusqu'à ce qu'on obtienne ls Nä et appuyez sur tab à nouveau, la commande s'étend à ls Nättökuva.png [sic].

Si j'essaie d'effacer les lettres une deuxième fois, je reviens à ls Nä et appuyez sur la touche tabulation, il s'étend à ls Nätökuva.png . Le troisième passage s'étend à ls Näökuva.png .

Pour une raison quelconque, la quatrième manche donne ls Näkuva.png (remarquez les trémas sur les trémas). En appuyant sur la touche ls Nä donne ls Näkuva.png à chaque fois. Néanmoins, cela fonctionne :

$ ls Näkuva.png
Näyttökuva.png

$ history 2
518  ls Näyttökuva.png 
519  history 2

29voto

Gordon Davisson Points 30215

Je pense que Bash se heurte à des anomalies dans la façon dont les caractères accentués sont traités. Vous devriez prendre du pop-corn, parce que ça va devenir technique pendant un moment...

Unicode permet à certains caractères accentués d'être représentés de plusieurs manières différentes : comme un "point de code" représentant le caractère accentué, ou comme une série de points de code représentant la version non accentuée du caractère, suivie du ou des accents. Par exemple, "ä" pourrait être représenté soit pré-composé comme U+00E4 (UTF-8 0xc3a4, petite lettre latine 1 avec tréma), soit décomposé comme U+0061 U+0308 (UTF-8 0x61cc88, petite lettre latine a + combinant le tréma).

Le système de fichiers HFS+ d'OS X exige que tous les noms de fichiers soient stockés dans la représentation UTF-8 de leur nom. forme entièrement décomposée . Dans un nom de fichier HFS+, "ä" DOIT être codé comme 0x61cc88, et "ö" DOIT être codé comme 0x6fcc88.

Je suis presque sûr que ce qui se passe ici est que lorsque vous tapez "Näyttökuva.png" à la ligne de commande, cela "tape" les caractères sous une forme précomposée. Lorsque le fichier est créé, le système de fichiers décompose les caractères pour les stocker. Tout se passe bien jusqu'à présent. Mais lorsque vous essayez d'utiliser la complétion par tabulation en commençant par "Nä", je pense que bash ne décompose pas le "ä" avant de chercher des correspondances, et bien sûr il n'en trouve pas.

Pour illustrer la différence, voici un exemple de l'encodage utilisé lorsque je tape simplement "Näyttökuva.png" à la ligne de commande, par rapport à celui utilisé lorsque je le stocke comme nom de fichier et que j'utilise la complétion de tabulation pour le remplir :

$ printf Näyttökuva.png | xxd    # This time I pasted the it in from this web page
0000000: 4ec3 a479 7474 c3b6 6b75 7661 2e70 6e67  N..ytt..kuva.png
$ touch Näyttökuva.png           # Also pasted from the web
$ printf Näyttökuva.png | xxd    # This time I tab-completed it after N
0000000: 4e61 cc88 7974 746f cc88 6b75 7661 2e70  Na..ytto..kuva.p
0000010: 6e67                                     ng

Pour ce qui est de la perte de caractères lors de la suppression et du re-tab, je pense que c'est étroitement lié. Plus précisément, je pense que bash "supprime" un point de code par pression de la touche delete, mais efface un caractère de la fenêtre du terminal par pression. Comme l'un des caractères supprimés ("ö" cette fois) était composé de deux points de code, mais d'un seul caractère, l'affichage du terminal est désynchronisé. Essayez de compléter par tabulation le nom de fichier entier, de le supprimer à nouveau jusqu'à "Näytt", puis de le compléter à nouveau par tabulation : bash semble penser que seul le tréma de combinaison a été supprimé, et non le "ö" entier, donc il ajoute à nouveau le tréma de combinaison, mais cette fois-ci il s'attache au "t" :

$ echo Näyttkuva.png 
Näyttökuva.png

Notez que lorsque j'appuie sur la touche retour, bash contient en fait le nom de fichier complet ; c'est juste l'affichage du terminal qui est confus.

TL;DR bash a des bogues dans la gestion des caractères accentués décomposables.

EDIT : après avoir réfléchi, je pense que la seule solution complète est de corriger bash (/attendre que ses développeurs le fassent). Il pourrait aussi y avoir un moyen de saisir les caractères sous forme décomposée, mais je n'ai aucune idée de ce que cela pourrait être. Mais j'ai trouvé quelques solutions de contournement partielles :

  1. Le glisser-déposer d'un fichier depuis le Finder colle sa forme correcte. Étant donné que le Finder obtient le nom du fichier à partir du système de fichiers, il est déjà décomposé, et cela fonctionne tout simplement.

  2. Vous pouvez en fait compléter par une tabulation le caractère accentué lui-même. Par exemple, si vous tapez "Na" et ensuite tab, cela correspondra à "Näyttökuva.png" parce que la décomposition canonique de "ä" commence par "a". Mais si vous avez un fichier nommé "Narwal.gif" dans le même répertoire, cela ne sera pas très utile...

  3. Je n'ai pas testé cela, mais si vous liez la tabulation à menu-complet au lieu de complète, elle devrait vous permettre de tabuler sur les correspondances possibles afin que vous puissiez sélectionner celle que vous voulez même si vous ne pouvez pas taper la lettre suivante. (Ou vous pourriez le lier à une autre touche, afin de ne l'utiliser que lorsque vous en avez besoin).

  4. Pour résoudre le problème de désynchronisation de l'affichage du terminal, vous pouvez lier quelque chose à redessiner la ligne actuelle -- Cela n'empêchera pas le problème de se produire, mais cela vous donnera un moyen de resynchroniser l'affichage.

4voto

Wild Penguin Points 41

Il s'agit d'une vieille question, sans réponse définitive. Seulement des solutions de contournement.

Cependant j'ai combiné quelques informations de ce vieux guide, et comme suggéré et instruit aquí :

J'ai installé une nouvelle version de bash dans mon Snow Leopard. Après l'avoir installé, la complétion de bash fonctionne correctement ! (Snow Leopard a été livré avec 3.2.48(1) et MacPorts a installé 4.2.45_1). N'oubliez pas d'effectuer les changements dans /etc/shells et en cours d'exécution chsh .

En outre, en raison de certaines autres instructions, j'ai en .inputrc :

set meta-flag on
set input-meta on
set output-meta on
set convert-meta off

Je ne sais pas s'ils sont nécessaires ou non pour un bon fonctionnement.

1voto

Matthias M Points 145

iconv est la solution, qui a fonctionné pour moi :

ls `echo 'Näyttkuva.png' | iconv -t UTF8-MAC`

voir https://stackoverflow.com/a/23226449/1909531

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X