2010-02-22 2 views
49

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

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

Первый, который я попробовал, - «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 

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

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

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

ответ

23

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

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" 
+3

я не знаю, что означает, что argdo, но я попробовал это, и она работает: 'ВИМ + "набор бомбы | набор fileencoding = UTF-8 | WQ" $ (найти -типа е -name * .php.) ' – NovumCoder

+2

Хорошо. argdo просто повторяет команду для каждого файла в списке аргументов. –

16

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

set bomb 
set fileencoding=utf-8 
wq 

Тогда йо u вызывают Vim с опцией -S (источник), чтобы выполнить скрипт в файле, который вы хотите исправить. Для того, чтобы сделать это на кучу файлов, которые вы могли бы сделать

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

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

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

+1

Примечания должны быть поставлены перед рекомендацией. ;) – Zolomon

+1

'bomb' нарушает совместимость ASCII. См. [Этот ответ] (http://stackoverflow.com/questions/5477565/how-to-setup-vim-properly-for-editing-in-utf-8). – tchrist

3

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

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

файл выглядел как этот

#!/usr/bin/perl 
... 

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

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

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

Решение

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

Это устраняет BOM в начале файла, что делает его правильно utf8.

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

+0

Благодарим вас за благородство. Я боролся с этой проблемой. В конечном итоге я использовал VIM. Например: vim + "set nobomb | set fenc = utf-8 | x" TEST.CSV – jjwdesign