¿Cómo encuentro la codificación del búfer actual en vim?


83

Digamos que estoy editando algún archivo con vim (o gvim). ¿No tengo idea de la codificación del archivo y quiero saber si está en UTF-8 o ISO-8859-1 o lo que sea? ¿Puedo decirle a vim que me muestre qué codificación se utiliza?

Respuestas:


94

La configuración de codificación de archivo muestra la codificación del búfer actual:

:set fileencoding
fileencoding=utf8

Realmente no hay una forma común de determinar la codificación de un archivo de texto plano, ya que esa información no se guarda en el archivo en sí, excepto en los archivos UTF-8 donde se encuentra la llamada lista de materiales que indica la codificación. Es por esto que los archivos xml y html tienen metatags de conjuntos de caracteres.

Puede imponer una codificación particular con la configuración de 'codificación'. Ver :help encoding y :help fileencoding en Vim por cómo el editor maneja estas configuraciones. También puede agregar varias configuraciones de codificación de archivos a su vimrc para que vim intente detectar basándose en las que se enumeran.


1
Perfecto. Incluso si algo contrario intuitivo. ¡Gracias!
innaM

7
Desafortunadamente, no es correcto. Porque Vim no puede encontrar La codificación del archivo que estás leyendo. No está escrito en el archivo. Solo puede adivinar basándose en los caracteres disponibles en el archivo. Por ejemplo, un archivo con el texto "abcdef" puede estar en varias codificaciones, ya que prácticamente todos admiten esos caracteres, pero es probable que un archivo con "šđčćž" esté en CP1252. Entonces, no estás leyendo la codificación de algún lado, sino adivinando qué codificación podría ser esa, y basándote en que se muestre correctamente.
Rook

6
Lo que estás haciendo aquí es explícitamente ajuste La codificación, basada en sus observaciones de los contenidos del archivo. Si desea que vim pruebe varias codificaciones, al abrir un archivo, coloque varias de ellas en la opción en su _vimrc.
Rook

@ldigas, gracias por los comentarios, he actualizado la respuesta para ser un poco más claro al respecto (¡espero!)
jtimberman

2
Probablemente vale la pena mencionar que las listas de materiales son 1.) No es exclusivo de UTF-8 - aunque UTF-8 es distinto de otras listas de materiales, 2.) No es necesario y, a menudo, no se encuentra en UTF-8 .
ruffin

12

Tenga en cuenta que la codificación de los archivos es no declarado explícitamente En cualquier lugar en un archivo. Por lo tanto, VIM y otras aplicaciones deben adivinar la codificación. La forma canónica de hacer esto es con la chardet Aplicación, que puede ejecutarse desde VIM como tal:

:!chardet %

La respuesta proporcionada por jtimberman le muestra la codificación de la buffer actual que puede no ser la misma codificación que el archivo en el disco. Así, te darás cuenta de que chardet a veces mostrará una codificación diferente a VIM, especialmente si tiene VIM configurado para usar siempre una codificación específica (es decir, UTF-8).

Lo bueno de chardet es que da un puntaje de confianza para su conjetura, mientras que VIM puede (y con frecuencia es) equivocarse al adivinar la codificación si no hay muchos caracteres arriba de \ x7F (ASCII 127). Por ejemplo, añadiendo un solo א a un largo archivo de código PHP hace chardet piensa que el archivo es ISO-8859-2 con una confianza de 0,72, mientras que añadiendo la frase un poco más larga שלום, עולם!‏ Da UTF-8 con un puntaje de confianza de 0.99. En ambos casos, set fileencoding? mostró UTF-8 no porque el archivo en el disco fuera UTF-8, sino porque VIM está configurado para usar UTF-8 internamente.


Le sugiero que mencione una palabra acerca de la disponibilidad de chardet en los sistemas operativos.
Soundararajan

@Soundararajan: Probablemente no soy el tipo que lo menciona, ya que solo uso Debian y CentOS. Sin embargo, está invitado a editar la respuesta si tiene información relevante. ¡Gracias!
dotancohen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.