Comment puis-je changer l'encodage d'un fichier avec vim?

235

J'ai l'habitude d'utiliser vim pour modifier les fins de ligne d'un fichier:

$ file file
file: ASCII text, with CRLF line terminators
$ vim file
:set ff=mac
:wq
$ file file
file: ASCII text, with CR line terminators

Est-il possible d'utiliser un processus similaire pour modifier l'encodage unicode d'un fichier? J'essaie ce qui suit, ce qui ne fonctionne pas:

$ file file.xml
file.xml: Unicode text, UTF-16, little-endian
$ vim file
:set encoding=utf-8
:wq
$ file file.xml
file.xml: Unicode text, UTF-16, little-endian

J'ai vu quelqu'un dire qu'il pouvait "définir fileencoding = utf-8, puis mettre à jour et écrire le fichier, et cela fonctionne", mais il semble que je manque quelque chose, sinon il était confus. Je ne sais pas ce qu'il entendait par «alors mettre à jour».

skiphoppy
la source

Réponses:

163

Notez qu'il y a une différence entre

définir l'encodage

et

définir l'encodage de fichier

Dans le premier cas, vous allez modifier l'encodage de sortie affiché dans le terminal. Dans le second cas, vous allez modifier l'encodage de sortie du fichier qui est écrit.

Johan
la source
1
Merci! Apache produisait utf-8, php aussi, ainsi le navigateur l'a dit, donc vim a dit avec set encoding, et toujours les pages ont montré des caractères mutilés qui étaient bien comme iso-8859-1. l'utilisation a set fileencodingmontré un joli «Latin1»
Adriano Varoli Piazza
77

Bien que l'utilisation de vim soit parfaitement possible, pourquoi ne pas simplement utiliser iconv? Je veux dire - charger l'éditeur de texte juste pour faire la conversion d'encodage semble utiliser un marteau trop gros pour un clou trop petit.

Juste:

iconv -f utf-16 -t utf-8 file.xml > file.utf8.xml

Et tu as fini.


la source
19
Inconvénient, iconv n'est peut-être pas facilement disponible sous Windows.
Adriano Varoli Piazza
2
@AdrianoVaroliPiazza ni vim.
1
Je dirais que plusieurs téléchargements "il suffit d'installer", avec même une édition portable "constituent" facilement disponibles ".
Adriano Varoli Piazza
2
@ adriano-varoli-piazza Non, iconv est disponible sur Windows avec Cygwin et MingW, comme l'a noté @ coder-tim.
t0r0X
1
@mario Non, Vim très facilement disponible sur Windows: vim.org/download.php#pc
t0r0X
52

Tout comme vos étapes, la définition du codage de fichier devrait fonctionner. Cependant, je voudrais ajouter un "set bomb" pour aider l'éditeur à considérer le fichier comme UTF8.

$ vim file
:set bomb
:set fileencoding=utf-8
:wq
Francis
la source
8
Merci pour votre réponse, cela m'a amené à en savoir plus sur la marque d'ordre des octets UTF. Cependant, pour info, la définition d'une nomenclature semble inutile / déconseillée pour UTF-8 car ce n'est pas un format de longueur d'octet fixe comme 16 ou 32. Voir ici pour une explication et une référence. Ce n'est pas un problème (et même utile) pour vim, je pensais juste que les gens devraient juste être conscients que cela peut causer des problèmes de compatibilité ailleurs.
joelhardi
2
Est-ce bombou bompeut-il être unset? EDIT : Oui, vous pouvez le supprimer via set nobomb.
icedwater
6
Oui, VIm nous a mis en place le bomb(avec ab).
ruffin
par les documents, :set bombest activé si :set fenc=utf-8.. voir:he bomb
Evan Carroll
12
tous nos encodages de base appartiennent désormais à UTF-8
roblogic
6

Il pourrait être utile de modifier l' encodage uniquement sur la ligne de commande avant la lecture du fichier:

rem On MicroSoft Windows
vim --cmd "set encoding=utf-8" file.ext
# In *nix shell
vim --cmd 'set encoding=utf-8' file.ext

Voir à partir , --cmd.

Hans Ginzel
la source
3
La première variante devrait également fonctionner sur les shells * nix. 'single quotes'ne sont nécessaires que pour échapper à tous les méta-caractères, ce qui n'est généralement pas ce que vous voulez.
jpaugh