Comment trouver le codage du tampon actuel dans vim?

89

Dites que je modifie un fichier avec vim (ou gvim). Je n'ai aucune idée du codage du fichier et je veux savoir s'il s'agit du format UTF-8 ou ISO-8859-1 ou autre. Puis-je dire à vim de me montrer quel encodage est utilisé?

innaM
la source

Réponses:

104

Le paramètre fileencoding indique le codage du tampon actuel:

:set fileencoding
fileencoding=utf8

Il n'y a pas vraiment de moyen courant de déterminer le codage d'un fichier en texte brut, car ces informations ne sont pas enregistrées dans le fichier lui-même - à l'exception des fichiers UTF-8 où vous avez une soi-disant nomenclature indiquant le codage. C'est pourquoi les fichiers XML et HTML ont des métatags charset.

Vous pouvez appliquer un encodage particulier avec le paramètre 'encoding'. Voir :help encodinget :help fileencodingdans Vim pour savoir comment l'éditeur gère ces paramètres. Vous pouvez également ajouter plusieurs paramètres de codage de fichiers à votre vimrc pour que vim tente de détecter en fonction de ceux répertoriés.

jtimberman
la source
1
Parfait. Même si quelque peu contre-intuitif. Je vous remercie!
InnaM
7
Malheureusement, pas correct. Car Vim ne trouve pas l’encodage du fichier que vous lisez. Ce n'est pas écrit dans le fichier. Il ne peut que deviner en fonction des caractères disponibles dans le fichier. Par exemple, un fichier avec le texte "abcdef" peut figurer dans plusieurs codages, car pratiquement tous prennent en charge ces caractères, mais un fichier avec "šđčćž" sera probablement dans le fichier CP1252. Donc, vous ne lisez pas l'encodage quelque part, mais devinez ce que l'encodage pourrait être, et basé sur cela pour l'afficher correctement.
Rook
6
Ce que vous faites ici est de définir explicitement l'encodage, en fonction de vos observations sur le contenu du fichier. Si vous souhaitez que vim essaie plusieurs encodages, ouvrez plusieurs d’entre eux dans l’option de votre _vimrc.
Rook
@ldigas, merci pour les commentaires, j'ai mis à jour la réponse pour être un peu plus clair à ce sujet (j'espère!)
jtimberman
2
Il convient probablement de mentionner que les nomenclatures sont 1.) Pas uniques à UTF-8 - bien que les UTF-8 soient distinctes des autres nomenclatures, 2.) Non requis et souvent non trouvés dans UTF-8 .
Ruffin
13

Notez que l'encodage des fichiers n'est explicitement indiqué nulle part dans un fichier. Ainsi, VIM et d'autres applications doivent deviner le codage. La manière canonique de faire cela est avec l' chardetapplication, qui peut être exécutée à partir de VIM de la manière suivante:

:!chardet %

La réponse fournie par jtimberman vous montre le codage du tampon actuel, qui peut ne pas être le même que le fichier sur le disque. Ainsi, vous remarquerez que l’ chardetencodage sera parfois différent de celui de VIM, en particulier si vous avez configuré VIM pour toujours utiliser un encodage spécifique (c’est-à-dire UTF-8).

La bonne chose à propos de cela chardetest qu’elle donne un score de confiance pour son estimation, alors que VIM peut avoir tort (et a souvent tort) de deviner le codage s’il n’ya pas beaucoup de caractères supérieurs à \ x7F (ASCII 127). Par exemple, ajouter un simple אà un long fichier de code PHP laisse chardetpenser que le fichier a ISO-8859-2une confiance de 0,72, tandis que l'ajout de la phrase légèrement plus longue שלום, עולם!‏donne UTF-8 avec un indice de confiance de 0,99. Dans les deux cas, a set fileencoding?montré UTF-8non pas parce que le fichier sur le disque était UTF-8, mais parce que VIM est configuré pour utiliser UTF-8 en interne.

dotancohen
la source
Je vous suggère de mentionner un mot sur la disponibilité de chardet sur tous les systèmes d'exploitation.
Soundararajan
@Soundararajan: Je ne suis probablement pas le type à le mentionner car j'utilise uniquement Debian et CentOS. Vous êtes cependant invité à modifier la réponse si vous avez des informations pertinentes. Merci!
dotancohen
Je ne vois pas la nécessité de le faire à l' intérieur VIM, mieux le faire de l' extérieur: chardet <file>. Encore une bonne suggestion.
lepe
-1

J'ai trouvé que: https://vim.fandom.com/wiki/Reloading_a_file_using_a_different_encoding

Vous pouvez recharger un fichier en utilisant un codage différent si Vim n'a pas pu détecter le codage correct:

:e ++enc=<encoding>

encodingpourrait êtrecp850, ISO-8859-1, UTF-8, ...

Vous pouvez utiliser file yourfilenamepour rechercher un encodage ou chardetect(fourni par python-chardetou uchardetselon votre distribution Linux) comme suggéré par dotancohen.

Pierre-Damien
la source
Cela ne répond pas à la question de savoir comment trouver le codage actuel. Au lieu de cela, cette commande forcera un autre encodage dans la mémoire tampon.
Ruslan