2010-02-22 29 views
49

acabo de ser derribado después de que nuestro servidor se actualizó de Debian 4 a 5. Cambiamos al entorno UTF-8 y ahora tenemos problemas para obtener el texto impreso correctamente en el navegador, porque todos los archivos están en codificaciones que no son utf8, como iso-8859-1, ascii, etc.Cambiar la codificación del archivo a utf-8 a través de vim en un script

He intentado con muchos scripts diferentes.

El primero que probé es "iconv". Eso no funciona, cambia el contenido, pero los archivos que se encuentran todavía no son utf8.

Mismo problema con enca, encamv, convmv y algunas otras herramientas que instalé a través de apt-get.

Luego encontré un código python, que usa el módulo detector universal de Chardet, para detectar la codificación de un archivo (que funciona bien), pero no funciona la clase Unicode o la clase de códec para guardarlo como utf-8, sin cualquier error

La única forma en que encontré para convertir el archivo y su contenido convertido a UTF-8, es vi.

Estos son los pasos que hago para un archivo:

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

eso es todo. Ese funciona perfecto. Pero ¿cómo se puede ejecutar esto a través de un script? Me gustaría escribir un script (linux shell) que recorre un directorio que toma todos los archivos php, y luego los convierte utilizando vi con los comandos anteriores. ya que necesito para iniciar la aplicación vi, no sé cómo hacer algo como esto:

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

espero que alguien me puede ayudar.

Respuesta

23

Ésta es la forma más sencilla que conozco para hacer esto fácilmente desde la línea de comandos:

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

O mejor aún si se espera que el número de archivos que ser bastante grande:

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

No sé lo que significa que argdo, pero he intentado esto y funciona: 'vim + "conjunto de bomba | fijar fileEncoding = UTF-8 | WQ" $ (Encontrar -type f -name * .php.) ' – NovumCoder

+2

Bueno. argdo solo repite el comando para cada archivo en la lista de argumentos. –

16

se puede poner sus comandos en un archivo, vamos a llamarlo script.vim:

set bomb 
set fileencoding=utf-8 
wq 

Entonces yo Invoque Vim con la opción -S (fuente) para ejecutar el script en el archivo que desea corregir. Para hacer esto en un montón de archivos que podría hacer

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

También puede poner los comandos de Vim en la línea de comandos usando la opción +, pero creo que puede ser más fácil de leer como este.

Nota: No he probado esto.

+1

Las notas deben ponerse antes de la recomendación. ;) – Zolomon

+1

'bomba' rompe la compatibilidad ASCII. Ver [esta respuesta] (http://stackoverflow.com/questions/5477565/how-to-setup-vim-properly-for-editing-in-utf-8). – tchrist

3

Puede que realmente desee establecer nobomb (BOM = marca de orden de byte), especialmente en el mundo [not windows].

por ejemplo, tenía un script que no funcionaba, ya que había una marca de orden de bytes al principio. Por lo general, no se muestra en los editores (incluso con la lista establecida en vi) o en la consola, por lo que es difícil de detectar.

El archivo se veía así

#!/usr/bin/perl 
... 

Pero tratar de ejecutarlo, me sale

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

No se visualiza, pero al inicio del archivo, es la lista de materiales de 3 bytes. Entonces, en lo que se refiere a Linux, ¡el archivo no comienza con #!

La solución es

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

Esto elimina la lista de materiales al inicio del archivo, por lo que es utf8 correcta.

NB Windows usa la lista de materiales para identificar un archivo de texto como utf8, en lugar de ANSI. Linux (y la especificación oficial) no.

+0

Gracias la explicación nobomb. Estaba luchando con este problema. Finalmente utilicé VIM. Por ejemplo: vim + "set nobomb | set fenc = utf-8 | x" TEST.CSV – jjwdesign

Cuestiones relacionadas