Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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
Php 如何使用Perl将一组文件从ISO-8859-1转换为UTF-8?_Php_Perl_Utf 8_Iso 8859 1 - Fatal编程技术网

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

Php 如何使用Perl将一组文件从ISO-8859-1转换为UTF-8?,php,perl,utf-8,iso-8859-1,Php,Perl,Utf 8,Iso 8859 1,我有几个文件需要从ISO-8859-1转换为UTF-8(当然没有BOM)。这就是问题所在。我有很多这样的文档(实际上是一个文档的混合体,一些是UTF-8,一些是ISO-8859-1),所以我需要一种自动转换它们的方法。不幸的是,我只安装了ActivePerl,对该语言的编码知之甚少。我可能可以安装PHP,但我不确定,因为这不是我的个人电脑 正如您所知,我使用Scite或Notepad++,但两者都不能正确转换。例如,如果我用捷克语打开一个包含字符“ž”的文档并转到Notepad++中的“Conv

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

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

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

有什么想法吗?
谢谢

我不确定这是否是对您的特定问题的有效答案,但您是否已查看了答案?这是一个相当普遍的问题。

我不确定这是否是对您特定问题的有效答案,但您是否已经看过了答案?它非常普遍。

如果您可以访问cygwin,或者能够下载两个常用的*nix工具(您需要bash、grep、iconv和file,所有这些工具都可以通过,比如说,用于windows),那么您可能能够编写一个相当简单的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文档的“文件”确切含义是什么。

如果您可以访问cygwin或能够下载两个常用的*nix工具(您需要bash、grep、iconv和file,所有这些工具都可以通过,例如,)在windows上使用,您可以编写一个相当简单的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文档的“文件”确切含义是什么。

如果包含字符“ž”,则编码肯定不是ISO-8859-1(“拉丁1”),但可能是CP1252(“赢拉丁1”)。处理UTF8、ISO-8859-1和CP1252的混合(甚至可能在同一个文件中)正是Perl模块设计的目的

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

perl -MCPAN -e "install 'Encoding::FixLatin'"
然后可以编写一个使用Encoding::FixLatin模块的简短Perl脚本,但还有一种更简单的方法。该模块附带一个名为
fix\u latin
的命令,该命令对标准输入采用混合编码,并对标准输出写入UTF8。因此,您可以使用如下命令行转换一个文件:

fix_latin <input-file.txt >output-file.txt
fix_拉丁输出文件.txt
如果您正在运行Windows,那么fix_拉丁语命令可能不在您的路径中,并且可能没有通过pl2bat运行,在这种情况下,您需要执行以下操作:

perl C:\perl\bin\fix_latin.pl <input-file.txt >output-file.txt
perl C:\perl\bin\fix\u latin.pl output-file.txt
确切的路径和文件名需要根据您的系统进行调整


在Linux系统上,在一大堆文件上运行
fix_-latin
很简单,但在Windows上,您可能需要使用powershell或类似的工具。

如果包含字符“ž”,那么编码肯定不是ISO-8859-1(“拉丁1”),而是CP1252(“Win-latin 1”)。处理UTF8、ISO-8859-1和CP1252的混合(甚至可能在同一个文件中)正是Perl模块设计的目的

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

perl -MCPAN -e "install 'Encoding::FixLatin'"
然后可以编写一个使用Encoding::FixLatin模块的简短Perl脚本,但还有一种更简单的方法。该模块附带一个名为
fix\u latin
的命令,该命令对标准输入采用混合编码,并对标准输出写入UTF8。因此,您可以使用如下命令行转换一个文件:

fix_latin <input-file.txt >output-file.txt
fix_拉丁输出文件.txt
如果您正在运行Windows,那么fix_拉丁语命令可能不在您的路径中,并且可能没有通过pl2bat运行,在这种情况下,您需要执行以下操作:

perl C:\perl\bin\fix_latin.pl <input-file.txt >output-file.txt
perl C:\perl\bin\fix\u latin.pl output-file.txt
确切的路径和文件名需要根据您的系统进行调整


在Linux系统上,跨一大堆文件运行
fix_-latin
非常简单,但在Windows上,您可能需要使用powershell或类似的工具。

“ž”不是ISO-8859-1字符,而是Windows-1252中的字符。您可能正在特定于语言环境的8位编码中运行。需要更多的细节。我实际上认为文档是用ANSI编码的。我错误地在meta标记中写入了字符集设置。“ž”不是ISO-8859-1字符,但它在Windows-1252中。您可能正在特定于语言环境的8位编码中运行。需要更多的细节。我实际上认为文档是用ANSI编码的。我在meta标签中错误地写了字符集的设置。非常感谢grant!您的脚本与fix_拉丁语命令配合得非常好。我会想办法在多个文件中运行它。非常感谢格兰特!您的脚本与fix_拉丁语命令配合得非常好。我想办法在多个文件中运行它。