使用perl文件处理在csv中打印其他语言字符

时间:2013-08-23 08:45:23

标签: perl csv unicode file-handling

我正在使用德语搜索网站,我正在尝试使用Perl将网站内容存储在CSV中,但我在csv中面临垃圾值,我使用的代码是

    open my $fh, '>> :encoding(UTF-8)', 'output.csv';
    print {$fh} qq|"$title"\n|;
    close $fh;

例如:我希望Weiß,Römersandalen,但我得到Weiß,Römersandalen

更新:

代码

use strict;
use warnings;
use utf8;
use WWW::Mechanize::Firefox;
use autodie qw(:all);
my $m = WWW::Mechanize::Firefox->new();


print "\n\n *******Program Begins********\n\n";

$m->get($url) or die "unable to get $url";
my $Home_Con=$m->content;
my $title='';


if($Home_Con=~m/<span id="btAsinTitle">([^<]*?)<\/span>/is){
$title=$1;
print "title ::$1\n";
}
open my $fh, '>> :encoding(UTF-8)', 's.txt';      #<= (Weiß)
print {$fh} qq|"$title"\n|;
close $fh;

open $fh, '>> :encoding(UTF-8)', 's1.csv';      #<= (Weiß)

print {$fh} qq|"$title"\n|;
close $fh;

    print "\n\n *******Program ends********";
            <>;

这是代码的一部分。该方法适用于文本文件,但不适用于csv。

2 个答案:

答案 0 :(得分:1)

您已向我们展示了在将数据写入文件时正确编码数据的代码。

我们还需要看到的是数据如何进入您的程序。你在那时正确解码它吗?

<强>更新

如果代码真的只是my $title='Weiß ,Römersandalen',就像您在评论中所说的那样,那么解决方案就像在代码中添加use utf8一样简单。

关键是Perl需要知道如何解释它正在处理的字节流。在程序之外,数据以各种编码的字节存在。您需要在数据进入程序时对其进行解码(解码将字节流转换为字符串)并在离开程序时再次对其进行编码。您正在正确地执行编码步骤,但不是解码步骤。

use utf8修复了你在给出的简单示例中的原因是use utf8告诉Perl你的源代码应该被解释为编码为utf8的字节流。然后它将该字节流转换为包含'Weiß,Römersandalen'的正确字符的字符串。然后,它可以成功地将这些字符编码为字节,表示在写入文件时编码为utf8的字符。

您的数据实际上来自网页。我假设你正在使用LWP :: Simple或类似的东西。该数据可能被编码为utf8(我怀疑它,考虑到您遇到的问题)但它也可能编码为ISO-8859-1或ISO-8859-9或CP1252或任何其他编码。除非您知道编码是什么并正确解码传入数据,否则您将看到正在获得的结果。

答案 1 :(得分:-1)

使用 head tail 等命令检查文件的开头或任何位置是否有任何奇怪的字符