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

时间:2010-02-22 15:08:44

标签: file encoding utf-8 vi character-encoding

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

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

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

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

希望有人可以帮助我。

4 个答案:

答案 0 :(得分: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"

答案 1 :(得分:16)

您可以将命令放在一个文件中,我们称之为script.vim

set bomb
set fileencoding=utf-8
wq

然后使用-S(源)选项调用Vim,以在要修复的文件上执行脚本。要在一堆文件上执行此操作

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

您也可以使用+选项将Vim命令放在命令行上,但我认为它可能更具可读性。

注意:我没有测试过这个。

答案 2 :(得分:3)

您实际上可能需要设置nobomb (BOM =字节顺序标记),尤其是在[not 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将文本文件标识为utf8,而不是ANSI。 Linux(和官方规范)没有。

答案 3 :(得分:0)

接受的答案将使Vim中打开最后一个文件。使用Vim的-c选项可以很容易地解决此问题,

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