3

我正在抓取一个基于德语的网站,我正在尝试使用 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。

4

2 回答 2

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 或任何数量的其他编码。除非您知道编码是什么并正确解码传入的数据,否则您将看到您得到的结果。

于 2013-08-23T10:30:49.960 回答
-1

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

于 2017-03-01T11:53:37.727 回答