Как я могу изменить кодировку файла с помощью vim?

235

Я привык использовать vim для изменения концов строк файла:

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

Можно ли использовать аналогичный процесс для изменения кодировки Unicode файла? Я пытаюсь следующее, которое не работает:

$ 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

Я видел, как кто-то сказал, что он может «установить fileencoding = utf-8, затем обновить и записать файл, и это работает», но мне, кажется, что-то не хватает, иначе он был сбит с толку. Я не знаю, что он имел в виду под «тогда обнови».

skiphoppy
источник

Ответы:

254

Из документа :

: write ++ enc = utf-8 russian.txt

Таким образом, вы должны быть в состоянии изменить кодировку как часть команды записи.

Брайан Агнью
источник
2
обновленная ссылка на документацию: vimdoc.sourceforge.net/htmldoc/usr_45.html#45.4
Брайан Роджерс
163

Обратите внимание, что есть разница между

установить кодировку

и

установить кодирование файла

В первом случае вы измените выходную кодировку, отображаемую в терминале. Во втором случае вы измените выходную кодировку записанного файла.

Johan
источник
1
Спасибо! Apache выводил utf-8, так же как и php, как сказал браузер, так vim сказал set encoding, и все же на страницах были видны искаженные символы, которые были в порядке, как iso-8859-1. использование set fileencodingпоказало довольно «Latin1»
Адриано Вароли Пьяцца
77

Хотя использование vim делает это совершенно возможным, почему бы вам просто не использовать iconv? Я имею в виду - загрузка текстового редактора просто для преобразования кодировки выглядит как использование слишком большого молотка для слишком маленького гвоздя.

Просто:

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

И вы сделали.


источник
19
С другой стороны, iconv может быть недоступен в Windows.
Адриано Вароли Пьяцца
2
@AdrianoVaroliPiazza ни Вим.
1
Я бы сказал, что несколько «просто установочных» загрузок, даже с портативным изданием, «легко доступны»
Adriano Varoli Piazza
2
@ adriano-varoli-piazza Нет, iconv доступен в Windows вместе с Cygwin и MingW, как заметил @ coder-tim.
t0r0X
1
@mario Нет, Vim очень легко доступен в Windows: vim.org/download.php#pc
t0r0X
52

Как и ваши шаги, настройка fileencoding должна работать. Тем не менее, я хотел бы добавить одну «set бомбу», чтобы помочь редактору рассматривать файл как UTF8.

$ vim file
:set bomb
:set fileencoding=utf-8
:wq
Фрэнсис
источник
8
Спасибо за ваш ответ, это побудило меня узнать больше о метке порядка следования байтов UTF. Однако, к вашему сведению, установка спецификации кажется ненужной / нецелесообразной для UTF-8, так как это не фиксированный формат длины байта, как 16 или 32. Смотрите здесь для объяснения и ссылки. Это не проблема (и даже не полезно) для vim, я просто подумал, что люди должны просто знать, что это может вызвать проблемы совместимости в другом месте.
Джоэлхарди
2
Это bombили так bomи может быть unset? РЕДАКТИРОВАТЬ : Да, вы можете удалить его через set nobomb.
Ледяной воды
6
Да, VIm настроить нас bomb(с AB ).
Ёрш
согласно документам, :set bombвключается, если :set fenc=utf-8.. см.:he bomb
Эван Кэрролл
12
все наши базовые кодировки теперь принадлежат UTF-8
roblogic
6

Может быть полезно изменить кодировку только в командной строке перед чтением файла:

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

См начиная , --cmd.

Ханс Гинзел
источник
3
Первый вариант также должен работать на * nix оболочках. 'single quotes'нужны только для экранирования всех метасимволов, что обычно не то, что вы хотите.
jpaugh