Come trovo la codifica del buffer corrente in vim?


89

Supponiamo che sto modificando alcuni file con vim (o gvim). Non ho idea della codifica del file e voglio sapere se è in UTF-8 o ISO-8859-1 o altro? Posso in qualche modo dire a Vim di mostrarmi quale codifica viene utilizzata?

Risposte:


104

L'impostazione di codifica file mostra la codifica del buffer corrente:

:set fileencoding
fileencoding=utf8

Non esiste davvero un modo comune per determinare la codifica di un file di testo normale, poiché tali informazioni non vengono salvate nel file stesso, ad eccezione dei file UTF-8 in cui è presente una cosiddetta distinta componenti che indica la codifica. Questo è il motivo per cui i file xml e html hanno metatag charset.

È possibile applicare una codifica particolare con l'impostazione "codifica". Vedi :help encodinge :help fileencodingin Vim per come l'editor gestisce queste impostazioni. Puoi anche aggiungere diverse impostazioni di codifica dei file al tuo vimrc per fare in modo che vim tenti di rilevare in base a quelli elencati.


1
Perfetto. Anche se un po 'contro intuitivo. Grazie!
innaM,

7
Sfortunatamente, non corretto. Vim non riesce a trovare la codifica del file che stai leggendo. Non è scritto nel file. Può solo indovinare in base ai caratteri disponibili nel file. Ad esempio, un file con il testo "abcdef" può essere in diverse codifiche, poiché praticamente tutti supportano quei caratteri, ma un file con "šđčćž" sarà probabilmente nel CP1252. Quindi, non stai leggendo la codifica da qualche parte, ma indovinando quale codifica potrebbe essere e in base a quella che la visualizza correttamente.
Rook,

6
Quello che stai facendo qui è impostare esplicitamente la codifica, in base alle tue osservazioni sul contenuto del file. Se desideri che vim provi diverse codifiche, quando apri un file, mettine diverse nell'opzione nel tuo _vimrc.
Arriva il

@ldigas, grazie per il feedback, ho aggiornato la risposta per essere un po 'più chiaro su questo (spero!)
jtimberman

2
Probabilmente vale la pena ricordare che le distinte materiali sono 1.) Non univoco per UTF-8 - sebbene UTF-8 sia distinto dalle altre distinte materiali, 2.) Non richiesto e spesso non trovato in UTF-8 .
ruffin,

13

Si noti che la codifica dei file non è esplicitamente dichiarata in nessun punto del file. Pertanto, VIM e altre applicazioni devono indovinare la codifica. Il modo canonico di farlo è con l' chardetapplicazione, che può essere eseguita da VIM in questo modo:

:!chardet %

La risposta fornita da jtimberman mostra la codifica del buffer corrente che potrebbe non essere la stessa codifica del file sul disco. Pertanto, noterai che chardeta volte mostrerà una codifica diversa da VIM, specialmente se hai VIM configurato per utilizzare sempre una codifica specifica (cioè UTF-8).

La cosa bella chardetè che dà un punteggio di confidenza per la sua ipotesi, mentre VIM può essere (e spesso è) sbagliato nell'indovinare la codifica se non ci sono molti caratteri sopra \ x7F (ASCII 127). Ad esempio, l'aggiunta di un singolo אfile a un lungo file di codice PHP fa chardetpensare che il file abbia ISO-8859-2una confidenza di 0,72, mentre l'aggiunta della frase leggermente più lunga שלום, עולם!‏dà a UTF-8 un punteggio di confidenza di 0,99. In entrambi i casi, set fileencoding?mostrato UTF-8non perché il file sul disco era UTF-8, ma perché VIM è configurato per utilizzare UTF-8 internamente.


Suggerisco di menzionare una parola sulla disponibilità di chardet tra i sistemi operativi.
Soundararajan,

@Soundararajan: probabilmente non sono il tipo da menzionarlo visto che uso solo Debian e CentOS. Tuttavia, sei invitato a modificare la risposta se disponi di informazioni pertinenti. Grazie!
dotancohen,

Non vedo la necessità di farlo all'interno VIM, meglio farlo dall'esterno: chardet <file>. Comunque, buon consiglio.
lepe,

-1

Ho scoperto che: https://vim.fandom.com/wiki/Reloading_a_file_using_a_different_encoding

Puoi ricaricare un file usando una codifica diversa se Vim non è stato in grado di rilevare la codifica corretta:

:e ++enc=<encoding>

dove encodingpotrebbe esserecp850, ISO-8859-1, UTF-8, ...

Puoi usare file yourfilenameper trovare la codifica o chardetect(fornito da python-chardeto in uchardetbase alla tua distribuzione Linux) come suggerito da dotancohen.


Questo non risponde alla domanda su come scoprire la codifica corrente. Invece questo comando forzerà qualche altra codifica sul buffer.
Ruslan,
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.