【问题标题】:Change File Encoding to utf-8 via vim in a script在脚本中通过 vim 将文件编码更改为 utf-8
【发布时间】:2011-01-19 16:25:33
【问题描述】:

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

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

我尝试的第一个是“iconv”。那个不起作用,它改变了内容,但文件的编码仍然是非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"

希望有人可以帮助我。

【问题讨论】:

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


    【解决方案1】:

    接受的答案将保持最后一个文件在 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
    

    【讨论】:

      【解决方案2】:

      您实际上可能想要设置 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(和官方规范)没有。

      【讨论】:

      • 谢谢你的nobomb解释。我一直在努力解决这个问题。我最终使用了 VIM。例如:vim +"set nobomb | set fenc=utf-8 | x" TEST.CSV
      【解决方案3】:

      这是我所知道的从命令行轻松执行此操作的最简单方法:

      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"
      

      【讨论】:

      • 我不知道 argdo 是什么意思,但我试过了,它有效:vim +"set bomb | set fileencoding=utf-8 | wq" $(find . -type f -name *.php)
      • 好。 argdo 只是对参数列表中的每个文件重复该命令。
      【解决方案4】:

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

      set bomb
      set fileencoding=utf-8
      wq
      

      然后您使用-S (source) 选项调用 Vim 以在您希望修复的文件上执行脚本。要对一堆文件执行此操作,您可以这样做

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

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

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

      【讨论】:

      • 推荐前要备注。 ;)
      • bomb 破坏了 ASCII 兼容性。见this answer
      猜你喜欢
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      相关资源
      最近更新 更多