代码之家  ›  专栏  ›  技术社区  ›  tau

如何使用perl将一堆文件从iso-8859-1转换为utf-8?

  •  1
  • tau  · 技术社区  · 14 年前

    我有几个文件需要从iso-8859-1转换为utf-8(当然没有bom)。不过,这就是问题所在。我有很多这样的文档(实际上是文档的混合,一些utf-8和一些i so-8859-1),所以我需要一种自动转换它们的方法。不幸的是,我只安装了activeperl,对这种语言的编码知之甚少。我可能可以安装php,但我不确定这不是我的个人电脑。

    正如你所知,我使用scite或notepad++,但两者都不能正确转换。例如,如果我用捷克语打开一个包含字符“_”的文档,并转到记事本++中的“转换为UTF-8”选项,它会错误地将其转换为不可读字符。

    有一种方法我可以转换他们,但它是乏味的。如果我打开带有特殊字符的文档并将其复制到windows剪贴板,然后将其粘贴到utf-8文档中并保存,就可以了。对于我拥有的文档数量来说,这太乏味了(打开每个文件并将其复制/粘贴到新文档中)。

    有什么主意吗? 谢谢!!!!

    3 回复  |  直到 14 年前
        1
  •  5
  •   Grant McLean    14 年前

    如果包含字符“”,则编码肯定不是ISO-8859-1(“Latin 1”),而是可能是CP1252(“Win Latin 1”)。处理utf8、iso-8859-1和cp1252的混合(甚至可能在同一个文件中)正是 Encoding::FixLatin Perl模块是为。

    可以通过运行以下命令从cpan安装模块:

    perl -MCPAN -e "install 'Encoding::FixLatin'"
    

    然后,您可以编写一个使用encoding::fixlatin模块的简短Perl脚本,但有一种更简单的方法。模块附带一个名为 fix_latin 它在标准输入端采用混合编码,在标准输出端写入utf8。所以可以使用这样的命令行来转换一个文件:

    fix_latin <input-file.txt >output-file.txt
    

    如果您运行的是windows,那么fix_latin命令可能不在您的路径中,也可能没有通过pl2bat运行,在这种情况下,您需要执行以下操作:

    perl C:\perl\bin\fix_latin.pl <input-file.txt >output-file.txt
    

    确切的路径和文件名需要根据您的系统进行调整。

    运行 固定拉丁语 在Linux系统上,跨越一大堆文件是很简单的,但在Windows上,您可能需要使用Powershell或类似的工具。

        2
  •  1
  •   AKX Bryan Oakley    14 年前

    我不确定这是否是对你特定问题的有效答案,但你看过 GNU iconv tool ?这是相当普遍的。

        3
  •  1
  •   KT.    14 年前

    如果您有权访问cygwin,或者能够下载一些常用的*nix工具(您需要bash、grep、iconv和file,所有这些工具都可以通过 gnuwin32 ,您可能可以编写一个相当简单的shell脚本来完成这项工作。

    剧本会 大约 如下所示:

    for f in *;
    do
       if file $f | grep 'ISO-8859' > /dev/null;
       then
          cat $f | iconv -f iso-8859-1 -t utf-8 > $f.converted;
       else
          echo "Not converting $f"
       fi;
    done;
    

    不过,您需要测试这些步骤,例如,我不确定“file”对iso-8859文档究竟说什么。