Como posso alterar a codificação de um arquivo com o vim?

235

Estou acostumado a usar o vim para modificar as terminações de linha de um arquivo:

$ file file
file: ASCII text, with CRLF line terminators
$ vim file
:set ff=mac
:wq
$ file file
file: ASCII text, with CR line terminators

É possível usar um processo semelhante para alterar a codificação unicode de um arquivo? Estou tentando o seguinte, o que não funciona:

$ file file.xml
file.xml: Unicode text, UTF-16, little-endian
$ vim file
:set encoding=utf-8
:wq
$ file file.xml
file.xml: Unicode text, UTF-16, little-endian

Eu vi alguém dizer que ele poderia "definir fileencoding = utf-8, depois atualizar e escrever o arquivo, e funciona", mas parece que estou perdendo alguma coisa, ou ele estava confuso. Não sei o que ele quis dizer com "então atualize".

skiphoppy
fonte

Respostas:

163

Observe que há uma diferença entre

definir codificação

e

definir codificação de arquivo

No primeiro caso, você alterará a codificação de saída mostrada no terminal. No segundo caso, você alterará a codificação de saída do arquivo que está gravado.

Johan
fonte
1
obrigado! O Apache estava produzindo utf-8, assim como o php, dizia o navegador, dizia o vim set encoding, e as páginas ainda mostravam caracteres mutilados que estavam bem como iso-8859-1. usando set fileencodingmostrou um bonito 'Latin1'
Adriano Varoli Piazza
77

Enquanto usar o vim para isso é perfeitamente possível, por que você simplesmente não usa o iconv? Quero dizer - carregar o editor de texto apenas para fazer a conversão de codificação parece usar martelo muito grande para unha muito pequena.

Somente:

iconv -f utf-16 -t utf-8 file.xml > file.utf8.xml

E você terminou.


fonte
19
Desvantagem, o iconv pode não estar facilmente disponível no Windows.
Adriano Varoli Piazza
2
@AdrianoVaroliPiazza nem vim.
1
Eu diria que vários downloads "apenas instalam", com até uma edição portátil "constitui" facilmente disponível ".
Adriano Varoli Piazza
2
@ adriano-varoli-piazza Não, o iconv está disponível no Windows com Cygwin e MingW, como observou @ coder-tim.
t0r0X
1
@mario Não, o Vim está facilmente disponível no Windows: vim.org/download.php#pc
t0r0X
52

Assim como suas etapas, a configuração da codificação de arquivo deve funcionar. No entanto, gostaria de adicionar uma "bomba de conjunto" para ajudar o editor a considerar o arquivo como UTF8.

$ vim file
:set bomb
:set fileencoding=utf-8
:wq
Francis
fonte
8
Obrigado pela sua resposta, ele me levou a aprender mais sobre a marca de pedido de bytes UTF. No entanto, para o FYI, a configuração de uma lista técnica parece desnecessária / desaconselhável para o UTF-8, pois não é um formato fixo de comprimento de bytes como 16 ou 32. Consulte aqui para obter uma explicação e referência. Não é um problema (e até útil) para o vim, eu apenas pensei que as pessoas deveriam estar cientes de que isso pode causar problemas de compatibilidade em outros lugares.
Joelhardi #
2
É bombou bompode ser unset? EDIT : Sim, você pode removê-lo via set nobomb.
Icedwater
6
Sim, VIm nos criou o bomb(com ab).
Ruffin
pelos documentos, :set bombestá ativado se :set fenc=utf-8.. veja:he bomb
Evan Carroll
12
toda a nossa base codificação estão agora pertencem a UTF-8
roblogic
6

Pode ser útil alterar a codificação apenas na linha de comando antes que o arquivo seja lido:

rem On MicroSoft Windows
vim --cmd "set encoding=utf-8" file.ext
# In *nix shell
vim --cmd 'set encoding=utf-8' file.ext

Veja começando , --cmd.

Hans Ginzel
fonte
3
A primeira variação também deve funcionar em * nix shells. 'single quotes'são necessários apenas para escapar de todos os meta caracteres, o que geralmente não é o que você deseja.
jpaugh