Измените кодировку файла на utf-8 через vim в скрипте - PullRequest
50 голосов
/ 22 февраля 2010

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

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

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

23 голосов
/ 22 февраля 2010

Это самый простой из известных мне способов сделать это легко из командной строки:

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"
16 голосов
/ 22 февраля 2010

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

set bomb
set fileencoding=utf-8
wq

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

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

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

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

3 голосов
/ 22 октября 2014

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

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

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

0 голосов
/ 30 июля 2018

Принятый ответ сохранит последний файл открытым в 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
...