web-dev-qa-db-fra.com

Changer l'encodage de fichier en utf-8 via vim dans un script

je viens d’être démoli après la mise à jour de notre serveur de Debian 4 à 5 . Nous sommes passés à l’environnement UTF-8 et nous avons maintenant des problèmes pour imprimer le texte correctement sur le navigateur, car tous les fichiers sont encodés en non-utf8. comme iso-8859-1, ascii, etc.

J'ai essayé beaucoup de scripts différents.

Le premier que j'ai essayé est "iconv". Celui-là ne fonctionne pas, il change le contenu, mais les fichiers contenant sont toujours non-utf8.

Même problème avec enca, encamv, convmv et quelques autres outils que j’ai installés via apt-get.

Puis j'ai trouvé un code python, qui utilise le module chardet Universal Detector, pour détecter le codage d'un fichier (ce qui fonctionne bien), mais en utilisant la classe unicode ou la classe codec pour l'enregistrer en tant que utf-8 ne fonctionne pas, sans erreur.

Le seul moyen que j’ai trouvé pour obtenir le fichier et son contenu converti au format UTF-8 est vi.

Voici les étapes que je fais pour un fichier:

vi filename.php
:set bomb
:set fileencoding=utf-8
:wq

C'est tout. Celui-là fonctionne parfaitement. Mais comment faire en sorte que cela fonctionne via un script ... Je voudrais écrire un script (Linux shell) qui traverse un répertoire prenant tous les fichiers php, puis les convertit en utilisant vi avec les commandes ci-dessus . Comme il me faut démarrez l'application vi, je ne sais pas comment faire quelque chose comme ceci:

"vi --run-command=':set bomb, :set fileencoding=utf-8' filename.php"

J'espère que quelqu'un pourra m'aider.

50
NovumCoder

C'est le moyen le plus simple que je connaisse pour le faire facilement depuis la ligne de commande:

vim +"argdo se bomb | se fileencoding=utf-8 | w" $(find . -type f -name *.php)

Ou mieux encore si le nombre de fichiers devrait être assez important:

find . -type f -name *.php | xargs vim +"argdo se bomb | se fileencoding=utf-8 | w"
23
John Weldon

Vous pouvez mettre vos commandes dans un fichier, appelons-le script.vim:

set bomb
set fileencoding=utf-8
wq

Ensuite, vous appelez Vim avec l’option -S (source) pour exécuter le script sur le fichier que vous souhaitez réparer. Pour ce faire sur un tas de fichiers que vous pourriez faire

find . -type f -name "*.php" -exec vim -S script.vim {} \;

Vous pouvez aussi mettre les commandes Vim sur la ligne de commande en utilisant l'option +, mais je pense que cela peut être plus lisible comme ceci.

Note: je n'ai pas testé cela.

16
Hans W

Vous voudrez peut-être réellement set nobomb (BOM = marque d’octet), en particulier dans le monde [pas Windows].

par exemple, j'avais un script qui ne fonctionnait pas car il y avait une marque d'ordre des octets au début. Il n'est généralement pas affiché dans les éditeurs (même avec la liste définie dans vi), ni sur la console, il est donc difficile à repérer.

Le fichier ressemblait à ceci

#!/usr/bin/Perl
...

Mais en essayant de le courir, je reçois

./filename
./filename: line 1: #!/usr/bin/Perl: No such file or directory

Non affichée, mais au début du fichier, se trouve la nomenclature à 3 octets. Donc, en ce qui concerne Linux, le fichier ne commence pas par #!

La solution est

vi filename
:set nobomb
:set fileencoding=utf-8
:wq

Cela supprime la nomenclature au début du fichier, ce qui le corrige en utf8. 

Remarque: Windows utilise la nomenclature pour identifier un fichier texte comme étant utf8 plutôt qu'ANSI. Linux (et les spécifications officielles) ne le fait pas.

3
Andrew Murphy

La réponse acceptée gardera le dernier fichier ouvert dans Vim. Ce problème peut être facilement résolu en utilisant l’option -c de Vim,

vim +"argdo set bomb | set fileencoding=utf-8 | w" -c ":q" file1.txt file2.txt

Si vous n’avez besoin que de traiter un seul fichier, ce qui suit fonctionnera également. 

vim -c ':set bomb' -c ':set fileencoding=utf-8' -c ':wq' file1.txt
0
Libin Wen