Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 通过脚本中的vim将文件编码更改为utf-8_File_Encoding_Utf 8_Vi_Character Encoding - Fatal编程技术网

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

File 通过脚本中的vim将文件编码更改为utf-8,file,encoding,utf-8,vi,character-encoding,File,Encoding,Utf 8,Vi,Character Encoding,在我们的服务器从Debian 4升级到Debian 5后,我被击倒了。 我们切换到UTF-8环境,现在在浏览器上正确打印文本时遇到问题,因为所有文件都采用非utf8编码,如iso-8859-1、ascii等 我尝试了许多不同的脚本 我试过的第一个是“iconv”。这一个不起作用,它改变了内容,但文件的编码仍然是非utf8 我通过apt get安装的enca、encamv、convmv和其他一些工具也存在同样的问题 然后我发现了一个python代码,它使用chardet Universal Det

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

我尝试了许多不同的脚本

我试过的第一个是“iconv”。这一个不起作用,它改变了内容,但文件的编码仍然是非utf8

我通过apt get安装的enca、encamv、convmv和其他一些工具也存在同样的问题

然后我发现了一个python代码,它使用chardet Universal Detector模块来检测文件的编码(工作正常),但是使用unicode类或codec类将其保存为utf-8是不起作用的,没有任何错误

我找到的将文件及其内容转换为UTF-8的唯一方法是vi

以下是我为一个文件执行的步骤:

vi filename.php
:set bomb
:set fileencoding=utf-8
:wq
就这样。那一个很好用。但是我如何通过脚本来运行它呢? 我想编写一个脚本(LinuxShell),它遍历一个目录,获取所有php文件,然后使用上面的命令使用vi转换它们。 由于我需要启动vi应用程序,我不知道如何执行以下操作:

“vi--run命令=”: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命令放在命令行上,但我认为这样可能更可读


注意:我还没有测试过这一点。

您可能真的想要设置nobomb(BOM=字节顺序标记),尤其是在[非windows]世界中

e、 例如,我有一个脚本无法工作,因为在开始时有一个字节顺序标记。它通常不会显示在编辑器中(即使使用vi中的set list),也不会显示在控制台上,因此很难发现

文件看起来像这样

#!/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(和官方规范)没有。接受的答案将在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

我不知道argdo是什么意思,但我尝试了这个方法,效果很好:
vim+“set bomb | set fileencoding=utf-8 | wq”$(find.-type f-name*.php)
Good。argdo只是对参数列表中的每个文件重复该命令。注释应放在建议之前。;)<代码>炸弹破坏了ASCII兼容性。明白了,谢谢你的解释。我一直在努力解决这个问题。我最终使用了VIM。例如:vim+“set nobomb | set fenc=utf-8 | x”TEST.CSV