2010-02-22 9 views
49

Ho appena finito il servizio dopo che il nostro server è stato aggiornato da Debian 4 a 5. Siamo passati all'ambiente UTF-8 e ora abbiamo problemi a ottenere il testo stampato correttamente sul browser, perché tutti i file sono in codifiche non utf8 come iso-8859-1, ascii, ecc.Modifica codifica file in utf-8 tramite vim in uno script

Ho provato molti script diversi.

Il primo che ho provato è "iconv". Quello non funziona, cambia il contenuto, ma i file che codificano sono ancora non ut-8.

Stesso problema con enca, encamv, convmv e alcuni altri strumenti che ho installato tramite apt-get.

Quindi ho trovato un codice python, che utilizza il modulo Universal Detector di chardet, per rilevare la codifica di un file (che funziona bene), ma usando la classe unicode o la classe codec per salvarlo come utf-8 non funziona, senza eventuali errori.

L'unico modo in cui ho trovato il file e il suo contenuto convertito in UTF-8, è vi.

Questi sono i passi che faccio per un unico file:

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

questo è tutto. Quello funziona perfettamente. Ma come farlo funzionare tramite una sceneggiatura. Mi piacerebbe scrivere uno script (linux shell) che attraversi una directory prendendo tutti i file php, quindi li converta usando vi con i comandi sopra. come ho bisogno di avviare l'applicazione vi, non so come fare qualcosa di simile:

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

La speranza che qualcuno mi può aiutare.

risposta

23

Questo è il modo più semplice che conosco per fare questo facilmente dalla riga di comando:

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

O meglio ancora, se si prevede che il numero di file di essere abbastanza grande:

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

Non so che cosa significa che argdo, ma ho provato questo e funziona: 'vim + "impostare bomba | set fileencoding = utf-8 | WQ" $ (find -type f -name * .php.) ' – NovumCoder

+2

Buono. argdo ripete semplicemente il comando per ogni file nella lista degli argomenti. –

16

si potrebbe mettere i comandi in un file, chiamiamolo script.vim:

set bomb 
set fileencoding=utf-8 
wq 

Poi yo invocare Vim con l'opzione -S (origine) per eseguire lo script sul file che si desidera correggere. Per fare questo su un gruppo di file che si possa fare

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

si potrebbe anche mettere i comandi di Vim sulla riga di comando utilizzando l'opzione +, ma penso che potrebbe essere più leggibile come questo.

Nota: non l'ho ancora testato.

+1

Le note devono essere inserite prima della raccomandazione. ;) – Zolomon

+1

'bomba' rompe la compatibilità ASCII. Vedi [questa risposta] (http://stackoverflow.com/questions/5477565/how-to-setup-vim-properly-for-editing-in-utf-8). – tchrist

3

In realtà si può volere impostare nobomb (BOM = byte ordine mark), soprattutto nel mondo [non windows].

ad esempio, avevo uno script che non funzionava in quanto all'inizio c'era un segno di ordinamento dei byte. Di solito non viene visualizzato negli editor (anche con la lista dei set in vi) o sulla console, quindi è difficile da individuare.

Il file si presentava così

#!/usr/bin/perl 
... 

Ma cercando di farlo funzionare, ottengo

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

Non visualizzato, ma all'inizio del file, è la distinta base di 3 byte. Quindi, per quanto riguarda Linux, il file non inizia con #!

La soluzione è

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

Ciò elimina la BOM all'inizio del file, il che rende corretto utf8.

NB Windows utilizza il BOM per identificare un file di testo come utf8, anziché ANSI. Linux (e le specifiche ufficiali) no.

+0

Grazie la spiegazione della nobiltà. Ero alle prese con questo problema. Alla fine ho usato VIM. Ad esempio: vim + "set nobomb | set fenc = utf-8 | x" TEST.CSV – jjwdesign