我尝试了很多不同的脚本。
我尝试的第一个是“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"
希望有人可以帮助我。
答案 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