web-dev-qa-db-ja.com

スクリプトでvimを使用してファイルエンコーディングをutf-8に変更する

サーバーをDebian 4から5に更新した後、ノックダウンしました。UTF-8環境に切り替えたところ、すべてのファイルがiso-などの非UTF8エンコーディングであるため、ブラウザーでテキストを正しく印刷できません。 8859-1、asciiなど.

多くの異なるスクリプトを試しました。

最初に試したのは「iconv」です。それは機能せず、コンテンツを変更しますが、エンコードするファイルはまだ非utf8です。

Enca、encamv、convmv、およびapt-getを介してインストールした他のツールに関する同じ問題。

次に、pythonコード、chardet Universal Detectorモジュールを使用して、ファイルのエンコードを検出します(正常に動作します)が、Unicodeクラスまたはコーデッククラスを使用してutf-として保存します8はエラーなしで機能しません。

ファイルとそのコンテンツをUTF-8に変換するために見つけた唯一の方法はviです。

これらは、1つのファイルに対して行う手順です。

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

それでおしまい。それは完璧に動作します。しかし、スクリプトを使用してこれを実行するにはどうすればよいですか。すべてのphpファイルを取得してディレクトリを走査し、上記のコマンドでviを使用して変換するスクリプト(linux Shell)を作成したいと思います。私はviアプリを起動する必要があるため、このようなことをする方法がわかりません:

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

誰かが私を助けてくれることを願っています。

51
NovumCoder

これは、コマンドラインからこれを簡単に行うために知っている最も簡単な方法です。

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"
23
John Weldon

コマンドをファイルに入れることができます。それをscript.vimと呼びましょう:

set bomb
set fileencoding=utf-8
wq

次に、-S(ソース)オプションを指定してVimを起動し、修正するファイルでスクリプトを実行します。あなたができるファイルの束でこれを行うには

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

+オプションを使用してコマンドラインにVimコマンドを配置することもできますが、このように読みやすくなると思います。

注:これはテストしていません。

16
Hans W

実際には、set nobomb(BOM =バイトオーダーマーク)が必要な場合があります(特に[windowsではない]の世界では)。

たとえば、開始時にバイトオーダーマークがあったために動作しなかったスクリプトがありました。通常、エディタ(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は、BOMを使用して、ANSIではなくutf8としてテキストファイルを識別します。 Linux(および公式仕様)はサポートしていません。

3
Andrew Murphy

受け入れられた回答は、Vimで最後のファイルを開いたままにします。この問題は、Vimの-cオプションを使用して簡単に解決できます。

vim +"argdo set bomb | set fileencoding=utf-8 | w" -c ":q" file1.txt file2.txt

1つのファイルのみを処理する必要がある場合、以下も機能します。

vim -c ':set bomb' -c ':set fileencoding=utf-8' -c ':wq' file1.txt
0
Libin Wen