Come inserire caratteri speciali in modo che Bash / Terminal li capisca?

18

Diciamo che una cartella ha un file chiamato Näyttökuva.png (per coloro che sono interessati, è "screenshot" in finlandese). Questo è ciò che accade:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

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

Ciò influisce anche sul completamento automatico della tabulazione. Se inizio a digitare ls N e premi scheda è correttamente espanso a ls Näyttökuva.png . Ma se inizio a digitare ls Nä tabbing non fa nulla.

Come posso:

  • configura bash / terminal in modo da comprendere i caratteri speciali
  • digitare i caratteri speciali in modo che bash / terminal li capisca?

Nella codifica Impostazioni la codifica di Terminale è impostata su UTF-8 e la scheda Codifica è nel suo stato predefinito, es. UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep + alcuni codici asiatici sono abilitati.

Anche straniero (anche se probabilmente non è essenziale per la domanda):

Se digito ls N , premi tab , cancella caratteri dalla fine finché non legge ls Nä e premi tab di nuovo, il comando si espande in ls Nättökuva.png [sic].

Se provo a cancellare le lettere secondo tempo indietro a ls Nä e premo tab si espande a ls Nätökuva.png . La terza esecuzione si espande in ls Näökuva.png .

Per qualche motivo, la quarta esecuzione dà ls Nä̈kuva.png (noti le dieresi su dieresi). Tab il ls Nä̈ls Nä̈kuva.png ogni volta. Tuttavia, funziona:

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

$ history 2
518  ls Näyttökuva.png 
519  history 2
    
posta Jari Keinänen 19.03.2011 - 15:33
fonte

3 risposte

23

Penso che bash stia inciampando su alcune anomalie nel modo in cui i personaggi accentati vengono gestiti. Potresti prendere dei popcorn, perché questo diventerà tecnico per un po '...

Unicode consente di rappresentare alcuni caratteri accentati in diversi modi: come "punto di codice" che rappresenta il carattere accentato o come una serie di punti di codice che rappresentano la versione non accentata del personaggio, seguita dall'accento / i. Ad esempio, "ä" potrebbe essere rappresentato sia precomposto come U + 00E4 (UTF-8 0xc3a4, latina piccola 1 con diaeresi) o decomposto come U + 0061 U + 0308 (UTF-8 0x61cc88, lettera latina piccola a + diateresi combinata ).

Il filesystem HFS + di OS X richiede che tutti i nomi di file siano memorizzati nella rappresentazione UTF-8 dei loro modulo completamente decomposto . In un nome file HFS +, "ä" DEVE essere codificato come 0x61cc88 e "ö" DEVE essere codificato come 0x6fcc88.

Sono abbastanza sicuro che quello che sta succedendo qui è che quando scrivi "Näyttökuva.png" alla riga di comando, è "digitando" i caratteri in forma precomposta. Quando il file viene creato, il filesystem decompone i caratteri per la memorizzazione. Tutto va bene finora. Ma quando provi a usare tab-completion che inizia con "Nä", penso che bash non riesca a decomporre il "ä" prima di cercare le corrispondenze, e ovviamente non ne trova.

Per illustrare la differenza, ecco un esempio di quale codifica viene utilizzata quando digito semplicemente "Näyttökuva.png" nella riga di comando, rispetto a cosa viene usato quando lo memorizzo come nome file e uso il completamento della tabulazione per riempirlo in:

$ 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

Ora, per quanto riguarda la questione dei personaggi che si perdono durante l'eliminazione e il completamento delle tabulazioni, sospetto che sia strettamente correlato. Nello specifico, penso che bash stia "cancellando" un punto di codice per ogni pressione del tasto di cancellazione, ma cancellando un carattere dalla finestra del terminale per ogni pressione. Poiché uno dei caratteri eliminati ("ö" questa volta) era costituito da due punti di codice, ma solo un carattere, il display del Terminale non è più sincronizzato. Prova la tabulazione-completando l'intero nome del file, cancellandolo di nuovo in "Näytt", quindi ri-tab-completando: bash sembra pensare che solo la diaeresi combinata è stata cancellata, non l'intero "ö", quindi riaggiunge la diaeresi combinatoria , ma questa volta si collega alla "t":

$ echo Näytẗkuva.png 
Näyttökuva.png

Si noti che quando premo return, bash ha effettivamente l'intero nome del file lì; è solo il display del terminale che è stato confuso.

TL; DR bash ha alcuni bug che gestiscono caratteri accentati decomponibili.

EDIT: dopo un po 'di rimuginare, penso che l'unica soluzione completa sia quella di correggere bash (/ attendere che i suoi sviluppatori lo risolvano). Potrebbe anche esserci un modo per inserire caratteri in una forma scomposta, ma non ho idea di cosa sarebbe. Ma ho trovato alcuni rimedi parziali:

  1. Trascina e rilascia un file dalle paste del Finder nella sua forma corretta. Dal momento che Finder ottiene il nome file dal filesystem, è già scomposto, quindi funziona.

  2. In realtà puoi completare con schede il carattere accentato stesso. Ad esempio, se si digita "Na" e quindi scheda, corrisponderà "Näyttökuva.png" perché la decomposizione canonica di "ä" inizia con "a". Ma se hai un file chiamato "Narwal.gif" nella stessa directory, non sarà molto utile ...

  3. Non l'ho testato, ma se si associa la scheda a menu-complete anziché completare, dovrebbe consentire di scorrere le possibili corrispondenze in modo da poter selezionare quello desiderato anche se non è possibile digitare la lettera successiva. (Oppure puoi associarlo a un altro tasto, quindi puoi usarlo solo quando è necessario.)

  4. Per risolvere il problema con la visualizzazione del terminale che non è più sincronizzata, è possibile associare qualcosa a ridisegna-corrente-riga - non impedirà il verificarsi del problema, ma ti darà un modo per risincronizzare il display.

risposta data 19.03.2011 - 17:16
fonte
4

Questa è una vecchia domanda e nessuna risposta definitiva. Solo soluzioni alternative.

Tuttavia ho combinato alcune informazioni da questa vecchia guida e come suggerito e istruito qui :

Ho installato una nuova bash nel mio Snow Leopard. Dopo averlo installato, il completamento di bash funziona correttamente! (Snow Leopard fornito con 3.2.48 (1) e MacPorts installati 4.2.45_1). Ricordati di apportare le modifiche in /etc/shells e in esecuzione chsh .

Inoltre, a causa di alcune altre istruzioni, ho in .inputrc :

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

Non sono sicuro che siano necessari o meno per il corretto funzionamento.

    
risposta data 10.09.2013 - 21:50
fonte
0

iconv è la soluzione, che ha funzionato per me:

ls 'echo 'Näytẗkuva.png' | iconv -t UTF8-MAC'

vedi link

    
risposta data 08.07.2016 - 14:49
fonte

Leggi altre domande sui tag