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