2010-02-22 6 views
49

Je viens de me faire renverser 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 dans des encodages non-utf8 comme iso-8859-1, ascii, etc.Modification de l'encodage de fichier en utf-8 via vim dans un script

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

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

Même problème avec enca, encamv, convmv et d'autres outils installés via apt-get. Puis j'ai trouvé un code python, qui utilise chardet Universal Detector module, pour détecter l'encodage d'un fichier (qui fonctionne bien), mais en utilisant la classe unicode ou la classe codec pour l'enregistrer comme utf-8 ne fonctionne pas, sans des erreurs. Le seul moyen que j'ai trouvé pour obtenir le fichier et son contenu converti en UTF-8, est vi.

Ce sont les étapes que je fais pour un seul fichier:

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

Thats it. Celui-là fonctionne parfaitement. Mais comment peut-on l'exécuter via un script. Je voudrais écrire un script (shell Linux) qui parcourt un répertoire en prenant tous les fichiers php, puis en les convertissant en utilisant vi avec les commandes ci-dessus. Comme je dois commencer l'application vi, je ne sais pas comment faire quelque chose comme ceci:

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

quelqu'un Hope peut me aider.

Répondre

23

C'est la façon la plus simple que je connaisse pour faire facilement à partir de 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 grand:

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

Je ne sais pas ce que cela signifie argdo, mais je l'ai essayé cela et il fonctionne: 'vim + "bombe set | mettre fileencoding = utf-8 | wq" $ (trouver -type f -name * .php.) ' – NovumCoder

+2

Bien. argdo ne fait que répéter la commande pour chaque fichier dans la liste des arguments. –

16

vous pouvez mettre vos commandes dans un fichier, nous allons l'appeler script.vim:

set bomb 
set fileencoding=utf-8 
wq 

Alors yo Vous invoquez Vim avec l'option -S (source) pour exécuter le script sur le fichier que vous souhaitez corriger. Pour ce faire, sur un tas de fichiers que vous pouvez faire

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

Vous pouvez également mettre les commandes Vim sur la ligne de commande en utilisant l'option +, mais je pense qu'il peut être plus facile à lire comme ça.

Note: Je n'ai pas testé cela.

+1

Les remarques doivent être mises avant la recommandation. ;) – Zolomon

+1

'bomb 'rompt la compatibilité ASCII. Voir [cette réponse] (http://stackoverflow.com/questions/5477565/how-to-setup-vim-properly-for-editing-in-utf-8). – tchrist

3

Vous pouvez en fait définir nobomb (BOM = marque de commande d'octet), en particulier dans le monde [not windows]. Par exemple, j'ai eu un script qui ne fonctionnait pas car il y avait une marque d'ordre d'octet au début. Il n'est généralement pas affiché dans les éditeurs (même avec set list dans vi), ou sur la console, il est donc difficile à repérer.

Le fichier ressemblait à ce

#!/usr/bin/perl 
... 

Mais en essayant de le lancer, je reçois

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

Non affiché, mais au début du fichier, est la nomenclature 3 octets. Donc, pour ce qui est de 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 en fait UTF8 correct.

NB Windows utilise la nomenclature pour identifier un fichier texte comme étant utf8, plutôt qu'ANSI. Linux (et la spécification officielle) ne le fait pas.

+0

Merci l'explication de nobomb. Je luttais avec ce problème. J'ai finalement utilisé VIM. Par exemple: vim + "set nobomb | set fenc = utf-8 | x" TEST.CSV – jjwdesign