使用Perl将文件转换为UTF8格式

4

我如何使用Perl将文件转换为utf-8格式?如何检查已转换的文件是否为utf-8格式?


请在你的问题标题中减少大写字母的使用,这样做不会提高问题得到答案的速度。 - ThiefMaster
如何在 Perl 中将输入文件转换为 UTF-8 编码? - ax.
4个回答

3
安装到iconv库的绑定,如Text::Iconv并不必要,因为Perl已经自带了一个字符编码库:Encode。它的一部分是piconv,一个iconv(1)替代品。使用它来批量转换文件为UTF-8。 ANSI只是一个愚蠢的名称,用于表示windows-125?编码的一组。您很可能有以windows-1252编码的文件。例如:
piconv -f windows-1252 -t UTF-8 < input-file > output-file

如果元数据缺失,就需要使用启发式方法来确定文件内容的编码。我一直推荐使用Encode::DetectEncode::Detect::Detector


1

要进行转换,请查看Text::Iconv

  use Text::Iconv;
  $converter = Text::Iconv->new("fromcode", "tocode");
  $converted = $converter->convert("Text to convert");

谢谢Mark...但我无法弄清楚如何使用这些行...我有一个以ANSI格式保存的文件,必须保存为UTF8格式...当我使用utf8命令时,生成的文件仍然是ANSI格式(我使用记事本进行了检查)。有什么帮助吗? - xyz
@xyz,基本上你需要读取文件内容,并像daxim提到的那样使用Iconv或内置的Encode函数进行转换,然后保存回去。但是如果你的文件只包含ASCII字符<=0x7F,则输出文件也将相同,因为ASCII也是有效的UTF8。 - YOU
@xyz:ANSI 不是一种格式,而是微软用于表示编码集合的名称。您很可能使用的编码是“windows-1252”,因此请尝试将其从“windows-1252”转换为“UTF-8”。 - Christoffer Hammarström
1
你怎么知道它不是UTF-8编码?它使用ISO-646之外的字符吗? - bmargulies
当我使用Text :: Iconv时; 我收到错误消息:“无法在@INC(@ INC包含:C:/ Perl / lib C:/ Perl / site / lib 。)中找到Text / Iconv.pm”.. 我需要安装其他东西吗? 在uni1.pl第一行中中止BEGIN失败-编译。 - xyz
@xyz,你能否尝试使用@daxim提到的内置编码函数?我不确定如何在Windows上安装它。 - YOU

1

这取决于你得到的字符串。如果是上传的文件,我认为这段代码会有帮助。但如果是从网页获取的文本/自动转换成UTF-8编码的文本(因为你正在使用UTF-8),那么你将会遇到问题。

我通常使用:

use Encoding::Guess

my $enc = guess_encoding($string);

然后使用上述代码,我执行以下操作:

use Text::Iconv;
$converter = Text::Iconv->new($enc,"utf-8");
$converted = $converter->convert("Text to convert");

UTF-8列表可以在此处找到:

http://www.fileformat.info/info/charset/UTF-8/list.htm?start=1024

http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024&number=1024&utf8=string-literal&unicodeinhtml=dec


那个模块是Encode::Guess(http://search.cpan.org/dist/Encode/lib/Encode/Guess.pm) - Derek Kurth

1

使用 Encode 模块,您可以轻松编码为不同的编码格式

e.g;

my $str = "A string in Perl internal format ....";
my $octets = encode("utf-8",$str,Encode::FB_CROAK);

要检查 utf,您可以使用函数

is_utf8($str,Encode::FB_CROAK) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接