Измените кодировку файла на 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"
Надеюсь, кто-нибудь сможет мне помочь.
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. Эта проблема может быть легко решена с помощью опции
-cVim,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