Подтвердить что ты не робот

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

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

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

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

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

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

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

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

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

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

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

Надеюсь, кто-то может мне помочь.

4b9b3361

Ответ 1

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

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"

Ответ 2

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

set bomb
set fileencoding=utf-8
wq

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

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

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

Примечание. Я не тестировал это.

Ответ 3

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

например, у меня был script, который не работал, поскольку в начале был отмечен порядок байтов. Обычно это не отображается в редакторах (даже с установленным списком в 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 (и официальная спецификация) не делает.