2010-02-22 65 views
49

我刚刚撞倒我们的服务器已经从Debian的更新4至5 后,我们切换到UTF-8的环境,现在我们有获取文本问题正确打印在浏览器上,因为所有的文件都是非utf8编码,如iso-8859-1,ascii等。更改文件编码通过VIM UTF-8在脚本

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

我试过的第一个是“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"

希望有人能帮助我。

回答

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" 
+3

我不知道argdo意味着什么,但我想这和它的作品: 'VIM + “设置炸弹|设置fileencoding = utf-8 | WQ” $(找到型的F -name * .PHP。 )' – NovumCoder 2010-02-22 15:32:28

+2

好。 argdo只是重复参数列表中每个文件的命令。 – 2010-02-22 16:29:28

16

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

set bomb 
set fileencoding=utf-8 
wq 

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

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

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

注:我没有测试过这个。

+1

注意事项应在建议之前提出。 ;) – Zolomon 2011-01-15 15:06:05

+1

'bomb'打破ASCII兼容性。见[这个答案](http://stackoverflow.com/questions/5477565/how-to-setup-vim-properly-for-editing-in-utf-8)。 – tchrist 2011-04-26 21:51:27

3

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

例如,我有一个剧本,因为处于起步字节顺序标记,没有工作。它通常不会显示在编辑器(即使在六组列表),或在控制台上,所以它很难被发现。

文件看起来像这样

#!/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(和官方规范)没有。

+0

谢谢你的nobomb解释。我正在为这个问题而努力。我最终使用了VIM。例如:vim +“set nobomb | set fenc = utf-8 | x”TEST.CSV – jjwdesign 2016-10-03 13:50:17