Vim mostra strani personaggi <91>, <92>


26

Durante l'utilizzo di Vim su SSH ho copiato alcuni contenuti da una pagina Web alla mia sessione SSH / Vim e ho ottenuto il seguente risultato:

SIZE=`df -h|grep $DISC|awk <91>{print $2}<92>`

Apparentemente <91>e <92>rappresenta 'ma come posso cercare e sostituire queste cose? E cosa vuol 91/ 92dire? Come viene codificato perché 91/ 92in ASCII significa \e [?

Risposte:


23

Il contenuto della tua pagina web di origine è stato riformattato in modo eccessivo. Il testo è stato senza dubbio dovuto all'uso (diritto) virgolette singole (ASCII 39/0x27, U+0027) invece di virgolette singole graffe ( U+2018e U+2019che sono 0x91 and 0x92in CP1252 (noto anche come MS-ANSI e WINDOWS-1252, una codifica comune a 8-bit su Windows)) .

Vim ti mostra i codici esadecimali perché non sono validi in qualunque codifica stia usando Vim (probabilmente UTF-8). Se si sta modificando un testo che è già stato salvato in un file, è possibile ricaricare il file come CP1252 con :e ++enc=cp1252; questo dovrebbe rendere visibili le virgolette. Ma non v'è alcun motivo reale per ricaricarlo come CP1252, basta eliminare le 0x91e 0x92personaggi e sostituirli con virgolette singole.


Spesso si ottengono le virgolette / apostrofi ricci dal contenuto copiato da MS Word che inserisce automaticamente le virgolette / apostrofi ricci come parte della funzione "Citazioni intelligenti". Se il tuo carattere non supporta quei caratteri, otterrai solo uno spazio vuoto al posto del personaggio.
Lambacck,

1
+1 per:e ++enc=cp1252
wfaulk,

@ChrisJohnsen, c'è un modo per chiamare vi con una bandiera che realizza la stessa cosa di :e ++enc=cp1252? Se voglio vi dalla riga di comando un file contenente caratteri MS Word, sarebbe bello poterlo fare in un solo passaggio, anziché aprire vi e quindi caricare il file con il :ecomando
Leo Simon,

@LeoSimon: vim --cmd 'set fileencodings=cp1252' /path/to/file- Il comando viene eseguito prima del normale .vimrce imposta l' fileencodingsopzione (notare il finale s; è anche possibile utilizzare il nome più breve fencs) in modo che Vim proverà solo CP1252 durante il caricamento dei file. Questo dovrebbe funzionare per la modifica una tantum di tali file, ma può causare complicazioni se si desidera utilizzare quell'istanza di Vim per modificare i file con altre codifiche.
Chris Johnsen,

Grazie !, per essere espliciti, ora sto usandovim -c"set fencs" /path/to/file
Leo Simon l'

27

91 e 92 sono i codici esadecimali per l'apostrofo riccio aperto e chiuso (virgoletta singola) nella versione predefinita di MS Windows della codifica latin1 / ISO-8859-1, che è più specificamente chiamata cp1252 / Windows-1252 (dove cp sta per codice pagina).

Questi personaggi vengono spesso inseriti da persone che copiano contenuti da documenti Word / e-mail di Outlook come parte della funzione "Citazioni intelligenti". Altri caratteri problematici in questa tabella codici sono esadecimali 93/94 che sono apri e chiudi virgolette doppie, punto elenco (•) e legatura OE (œ e Œ). Puoi vedere un elenco completo dei "caratteri problematici", quelli che non mappano direttamente in ISO-8859-1 o UTF-8 con lo stesso codice, sulla pagina Wikipeda per cp1252 evidenziata in verde.

Se tutto ciò che desideri è aprire il file con la codifica corretta, utilizza l'opzione ++ enc = cp1252 per il comando: e:

:e ++enc=1252 filename.txt

Puoi sostituire un particolare codice esadecimale errato in Vim con il comando sostitutivo (: s) e una delle sostituzioni di codice:

\d123   decimal number of character
\o40    octal number of character up to 0377
\x20    hexadecimal number of character up to 0xff
\u20AC  hex. number of multibyte character up to 0xffff
\U1234  hex. number of multibyte character up to 0xffffffff

Per cambiare i caratteri esadecimali 91/92 in devi fare:

:%s/[\x91\x92]/'/g

Sarebbe bello avere un comando bash per sostituire quei caratteri in tutti i file nella directory. Ho trovato questo da una rapida ricerca su Google, sed -i "s/[\x91\x92]/\'/g" *.txtma non ha funzionato.
Buttle Butkus,

Ho appena trovato qualcosa che sembrava funzionare per la riga di comando. Questo trova / sostituisce tutti i file .txt nella cartella corrente. Reasearch perl prima di usare questo, però, perché non ho idea di cosa facciano gli switch. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus,

2
sed -i "s/\x92/'/g"ha funzionato per me.
Karoly Horvath,

3

Utilizzare iconvper convertire il file di testo da CP1252 a UTF-8 prima dell'apertura.

iconv -f cp1252 -t utf8 inputfile.csv > outputfile.csv

Su Mac OS usa questo:

iconv -f cp1252 -t UTF8-MAC inputfile.csv  > outputfile.csv

-3

In realtà stanno per hex 91 e 92, che nella tabella codici di Windows sono l'apertura e la chiusura di virgolette singole ('e' - Alt-0145 e Alt-0146).

Prova la seguente ricerca / sostituzione:

:s%/\<9[12]\>/'/g

1
Non posso sottovalutare a causa della mancanza di punti, ma questo comando di sostituzione è così sbagliato che non so da dove cominciare :(
lambacck

1
Questo non funziona per me: stackoverflow.com/questions/2798398/… fornisce una soluzione che funziona.
Confusione

@lambacck: supponevo che il file contenesse le stringhe letterali "91" e "92", e in quel caso questo comando è corretto. Se questi sono caratteri esadecimali, allora hai ragione, avresti bisogno del tuo comando di sostituzione o qualcosa di simile.
Alex
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.