如何使用Perl将一堆文件从ISO-8859-1转换为UTF-8?

时间:2010-04-17 00:06:18

标签: php perl utf-8 iso-8859-1

我需要将几个文档从ISO-8859-1转换为UTF-8(当然没有BOM)。但这是个问题。我有这么多文件(实际上是文件的混合,一些UTF-8和一些ISO-8859-1),我需要一种自动转换方式。不幸的是,我只安装了ActivePerl,对该语言的编码知之甚少。我可以安装PHP,但我不确定这不是我的个人电脑。

您知道,我使用的是Scite或Notepad ++,但两者都无法正确转换。例如,如果我在捷克语中打开包含字符“ž”的文档并转到Notepad ++中的“转换为UTF-8”选项,则会错误地将其转换为不可读的字符。

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

有什么想法吗? 感谢!!!

3 个答案:

答案 0 :(得分:5)

如果包含字符'ž',则编码绝对不是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系统上运行fix_latin跨越一大堆文件将是微不足道的,但在Windows上,您可能需要使用powershell或类似文件。

答案 1 :(得分:1)

我不确定这是否是您特定问题的有效答案,但您是否看过GNU iconv tool?它普遍适用。

答案 2 :(得分:1)

如果您有权访问cygwin或能够下载一些常见的* nix工具(您需要bash,grep,iconv和file,所有这些工具都可用于Windows,例如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;

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