Jak mogę zmienić kodowanie pliku za pomocą vima?

235

Jestem przyzwyczajony do używania vima do modyfikowania zakończeń linii pliku:

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

Czy można zastosować podobny proces do zmiany kodowania Unicode pliku? Próbuję następujących, które nie działają:

$ 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

Widziałem, jak ktoś powiedział , że może „ustawić fileencoding = utf-8, a następnie zaktualizować i zapisać plik, i to działa”, ale wydaje mi się, że czegoś mi brakuje, w przeciwnym razie był zdezorientowany. Nie wiem, co miał na myśli przez „następnie zaktualizuj”.

skiphoppy
źródło

Odpowiedzi:

163

Zauważ, że istnieje różnica między

ustawić kodowanie

i

ustaw kodowanie plików

W pierwszym przypadku zmienisz kodowanie wyjściowe wyświetlane w terminalu. W drugim przypadku zmienisz kodowanie wyjściowe zapisanego pliku.

Johan
źródło
1
Dziękuję Ci! Apache wyprowadzał utf-8, podobnie php, więc przeglądarka powiedziała, więc vim powiedział za pomocą set encoding, a mimo to strony pokazywały zniekształcone znaki, które były w porządku jako iso-8859-1. przy użyciu set fileencodingpokazał ładny „Latin1”
Adriano Varoli Piazza
77

Chociaż używanie vima do robienia tego jest całkowicie możliwe, dlaczego po prostu nie używasz iconv? Mam na myśli - ładowanie edytora tekstowego tylko w celu konwersji kodowania wygląda jak użycie zbyt dużego młotka dla zbyt małego gwoździa.

Właśnie:

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

I jesteś skończony.


źródło
19
Minusem, iconv może nie być łatwo dostępny w systemie Windows.
Adriano Varoli Piazza
2
@AdrianoVaroliPiazza ani vim.
1
Powiedziałbym, że wiele „tylko instaluje” pliki do pobrania, nawet w wersji przenośnej, stanowi „łatwo dostępne”
Adriano Varoli Piazza
2
@ adriano-varoli-piazza Nie, iconv jest dostępny w systemie Windows z Cygwin i MingW, jak zauważył @ coder-tim.
t0r0X
1
@mario Nie, Vim bardzo łatwo dostępny na Windowsie: vim.org/download.php#pc
t0r0X
52

Podobnie jak twoje kroki, ustawienie kodowania plików powinno działać. Chciałbym jednak dodać jeden „zestaw bomb”, aby pomóc redaktorowi uznać plik za UTF8.

$ vim file
:set bomb
:set fileencoding=utf-8
:wq
Francis
źródło
8
Dzięki za odpowiedź, dzięki niemu dowiedziałem się więcej o znaku kolejności bajtów UTF. Jednak FYI, ustawienie BOM wydaje się niepotrzebne / niewskazane dla UTF-8, ponieważ nie jest to format o stałej długości bajtów, jak 16 lub 32. Zobacz tutaj wyjaśnienie i odniesienie. Nie jest to problem (a nawet pomocny) dla vima, po prostu pomyślałem, że ludzie powinni mieć świadomość, że może to powodować problemy ze zgodnością gdzie indziej.
joelhardi
2
Jest to bombalbo bom, i to może być unset? EDYCJA : Tak, możesz go usunąć za pomocą set nobomb.
icedwater
6
Tak, VIm ustawił nam bomb(z ab).
ruffin
zgodnie z dokumentami, :set bombjest włączony, jeśli :set fenc=utf-8.. patrz:he bomb
Evan Carroll
12
wszystkie nasze podstawowe kodowania należą teraz do UTF-8
roblogic
6

Przydatna może być zmiana kodowania bezpośrednio w wierszu poleceń przed odczytaniem pliku:

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

Zobacz począwszy , --cmd.

Hans Ginzel
źródło
3
Pierwsza odmiana powinna również działać na powłokach * nix. 'single quotes'są potrzebne tylko do ucieczki od wszystkich meta znaków, co zwykle nie jest tym, czego chcesz.
jpaugh