通过脚本中的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(和官方规范)不。