我正在使用德语搜索网站,我正在尝试使用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。
答案 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 等命令检查文件的开头或任何位置是否有任何奇怪的字符