Измените кодировку файла на utf-8 через vim в скрипте



Я просто был сбит с ног после того, как наш сервер был обновлен с Debian 4 на 5.
Мы перешли на среду UTF-8, и теперь у нас есть проблемы с корректной печатью текста в браузере, потому что все файлы находятся в кодировках, отличных от utf8, таких как iso-8859-1, ascii и т. д.



Я перепробовал много разных сценариев.



Первый, который я попробовал, - это "iconv". Этот не работает, он изменяет содержимое, но файлы enconding по-прежнему не являются utf8.



Та же проблема с enca, encamv, convmv и некоторые другие инструменты, которые я установил через apt-get.



Затем я нашел код python, который использует модуль универсального детектора chardet, чтобы обнаружить кодировку файла (которая работает нормально), но использование класса unicode или класса codec для сохранения его как utf-8 не работает, без каких-либо ошибок.



Единственный способ, которым я нашел, чтобы получить файл и его содержимое, преобразованные в UTF-8, это vi.



Вот шаги, которые я делаю для одного файла:



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


Вот и все. Этот работает идеально. Но как можно получить это запуск через скрипт.
Я хотел бы написать скрипт (Linux shell), который проходит по каталогу, принимая все файлы php, а затем преобразуя их с помощью vi с помощью команд выше.
Поскольку мне нужно запустить приложение vi, я не знаю, как сделать что-то вроде этого:



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



Надеюсь, кто-нибудь сможет мне помочь.
831   4  

4 ответов:

Это самый простой способ, который я знаю, чтобы сделать это легко из командной строки:

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

Или еще лучше, если количество файлов ожидается довольно большим:

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

Вы можете поместить свои команды в файл, назовем его script.vim:

set bomb
set fileencoding=utf-8
wq

Затем вы вызываете Vim с параметром -S (source), чтобы выполнить сценарий для файла, который вы хотите исправить. Чтобы сделать это на куче файлов, вы можете сделать

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

Вы также можете поместить команды Vim в командную строку, используя опцию +, но я думаю, что это может быть более читаемым, как это.

Примечание: Я не проверял это.

Вы можете на самом деле хотеть установить nobomb (BOM = Знак порядка байтов), особенно в мире [не windows].

Например, у меня был скрипт, который не работал, так как в начале была метка порядка байтов. Он обычно не отображается в редакторах (даже с set list в vi) или на консоли, поэтому его трудно обнаружить.

Файл выглядел так

#!/usr/bin/perl
...

Но, пытаясь запустить его, я получаю

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

Не отображается, но в начале файла находится 3-байтовая спецификация. Итак, что касается linux обеспокоен, файл не начинается с #!

Решение является

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

Это удаляет спецификацию в начале файла, делая его правильным utf8.

NB Windows использует спецификацию для идентификации текстового файла как utf8, а не ANSI. Linux (и официальная спецификация) этого не делает.

Принятый ответ сохранит последний файл открытым в Vim. Эта проблема может быть легко решена с помощью опции -c Vim,

vim +"argdo set bomb | set fileencoding=utf-8 | w" -c ":q" file1.txt file2.txt

Если вам нужно обработать только один файл, то также будет работать следующее,

vim -c ':set bomb' -c ':set fileencoding=utf-8' -c ':wq' file1.txt

Comments

    Ничего не найдено.