Perl6程序崩溃的原因是UTF-8格式不正确。

5
我正在尝试下载一个网页;然后使用正则表达式进行分析;然后获取被正则表达式发现的文件。我有两个问题:
(1) 我使用wget来下载网页和文件,使用以下代码:
my $webPage = "onePage";
my $result = run <<wget -O $webPage $aSite>>, :out, :err;

其中$webPage是从wget输出的文件。问题:是否有perl6等价于wget?我使用了来自perl6网站的模块URI::FetchFile;它可以获取一些文件,但无法获取网页。

(2) 由wget下载的$webPage有时包含格式不正确的UTF-8字符,这导致我的程序崩溃。当我执行

cat onePage

从 shell 中看,那些格式错误的 UTF-8 字符会显示为一个 blob(二进制大块),而这个命令会和我的程序一样出现错误:
cat onePage | perl6 -ne '.say;'

"perl6 的错误输出为:"
Malformed UTF-8
  in block <unit> at -e line 1

在终端或shell上,一个格式不正确的UTF-8字符会显示为像这样的一个blob:
h�lt

如果我试图删除非打印字符,那么结果就是我会错过大量的文件链接。
$tmpLine ~~ s/<-[print]>//; # this causes my program to miss many files

如何最好地处理这些格式不正确的UTF-8字符,或任何格式不正确的Unicode字符,甚至是格式不正确的控制字符?

1个回答

3

是否有perl6的wget等效工具?

有几个。HTTP::Agent现在被认为是更为更新的,但也可以使用LWP::Simple

如何最好地处理这些格式不正确的UTF-8字符或任何格式不正确的Unicode甚至格式不正确的控制字符?

您可以尝试使用UTF8-C8编码。但如果您直接从perl6程序获取页面,则可能不是问题。

然而,崩溃是完全不同的事情。最好是创建一个Rakudo问题


崩溃是完全不同的事情。最好的方法是创建一个Rakudo问题。我相信lisprogtor只是指一个致命的运行时错误,可以正确地确定问题所在。lisprogtor,我对你所说的“崩溃”理解得对吗?假设你已经尝试了建议,你是否仍然认为提交错误报告有意义? - raiph
1
嗨jjmerelo和raiph,非常感谢您们的帮助。 我最终使用了shell(“iconv -f utf-8 -t utf-8 -c $webPage > $cleanPage”)来删除那些格式不正确的UTF-8字符,并使我的程序顺利运行。 希望Perl6有一个能够做到这一点的函数。 我将尝试从perl6中删除控制字符,因为格式不正确的字符看起来像控制字符。 - lisprogtor
回到崩溃问题,如果你将一个二进制字符串传递给perl6,则程序会退出。尝试:cat /usr/bin/zip | perl6 -ne '.say;' 和 cat /usr/bin/zip | perl6 -ne 'if /foo/ {.say;}';两者都将以相同的错误消息“Malformed UTF-8 in block <unit> at -e line 1”终止。我不确定perl6是否应该是这样的。但是,如果字符串不包含“foo”,那么它应该只是不匹配,而不是报告错误并终止。对吗? - lisprogtor
好的,我不能使用去除控制字符的方法来删除格式不正确的UTF-8字符。似乎perl6必须先解释该字符,然后才能将其分类为控制字符或其他字符。这段代码会导致相同的错误:cat /usr/bin/zip | perl6 -ne 's:g/<cntrl>/_/; .say;';,错误输出也相同:"Malformed UTF-8 in block <unit> at -e line 1"。 - lisprogtor

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