通过脚本中的vim将文件编码更改为utf-8

在我们的服务器已经从Debian 4更新到5之后,我刚刚被击倒。我们切换到UTF-8环境,现在我们在浏览器上正确打印文本时遇到问题,因为所有文件都是非UTF8编码, 8859-1,ascii等

我尝试了许多不同的脚本。

我尝试的第一个是“iconv”。 那一个不工作,它改变了内容,但文件的enconding仍然是非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 shell),它遍历一个目录,获取所有的php文件,然后使用上面的命令使用vi转换它们。 由于我需要启动vi应用程序,我不知道如何做这样的事情:

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

希望可以有人帮帮我。

这是我知道通过命令行轻松完成的最简单的方法:

 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 

然后你用-S (源)选项调用Vim来执行你想修复的文件上的脚本。 要做到这一点你可以做的一堆文件

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

你也可以使用+选项将Vim命令放在命令行上,但是我认为它可能更像这样的可读性。

注意:我没有testing过这个。

您可能实际上需要设置nobomb (BOM =字节顺序标记),特别是在[not windows]世界中。

例如,我有一个脚本没有工作,因为在开始时有一个字节顺序标记。 它通常不会在编辑器中显示(即使在vi中有设置列表),也不能在控制台上显示,所以难以发现。

这个文件看起来像这样

 #!/usr/bin/perl ... 

但试图运行它,我得到了

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

不显示,但在文件的开头,是3字节BOM。 所以,就linux而言,文件不是以#开始的!

解决scheme是

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

这将在文件开始时删除BOM,使其正确的utf8。

NB Windows使用BOM来将文本文件标识为utf8,而不是ANSI。 Linux(和官方规范)不。