Perl 6错误:UTF-8格式不正确

5

现在,我正在学习Perl 6; 我的第一个项目是制作一个HTTP客户端...出现了错误,我不明白为什么。

Malformed UTF-8 at line 1 col 45
  in method new at main.p6 line 13
  in block <unit> at main.p6 line 43

我认为这与端口变量有关,但我不确定。以下是我的 Perl 6 代码:

class Request 
{
    has     $!method;
    has     $!path;
    has     $!version;
    has     @!headers;
    has     $!socket;
    has     $.response is rw;

    method      new(:$method, :$path, :$host, :$port, :$version = "HTTP/1.1")
    {
        my $socket = IO::Socket::INET.new(:$host, :$port);
        return self.bless(:$method, :$path, :$version, :$socket);
    }

    submethod   BUILD(:$!method, :$!path, :$!version, :$!socket){}

    method      setHeader($name, $value)
    {
        my %header = name => $name, value => $value;
        @!headers.push({%header});
    }

    method      toString
    {
        my $request = "$!method $!path $!version\r\n";
        for @!headers -> %_ {
            $request ~= %_{'name'} ~ ": " ~ %_{'value'} ~ "\r\n";
        }
        $request ~ "\r\n";
    }

    method      send($i = 1)
    {
        say "Request send!";
        $!socket.print($.toString());
        say $!socket.recv for 0..$i;
    }
}
my $host = "127.0.0.1";
my Int $port = 58002;
my $request = Request.new(:method("GET"), :path("/"), :$host, :$port);

$request.setHeader("host", $host);
$request.setHeader("Accept-Language", "fr");
$request.send(2);

你确定它从服务器接收到有效的UTF8数据吗?另外,为什么它被命名为toString而不是更合理的Str - Brad Gilbert
如果您从其他地方复制并粘贴了该代码,则“/”或其他一些字符可能存在编码问题。请确保从您的编辑器中检查它是否可以保存为UTF8。 - jjmerelo
1
我只有7-8分钟的时间来写我的答案——只能对你的代码进行表面层次的理解。我希望它不会那么无用,让你感到恼怒或沮丧,但出乎意料的是,你竟然接受了它!它真的解释了你需要知道的所有内容和/或你已经解决了问题吗?当我写完答案时,我注意到我引用的代码是第42行,而不是43行,“第1行第45列”很令人困惑,因为它与数据有关,而不是代码,但它并没有说明这一点,错误消息的其余部分是代码的X行。我很想听听你对错误消息的批评。 - raiph
1个回答

5

这个回答可能对你没有帮助,甚至可能会有些烦人,但如果这是我唯一能提供的信息,我会在今天晚些时候将其删除并离开。

不知道您是否理解错误消息,但让我们先来看一下。

Malformed UTF-8 at line 1 col 45
  in method new at main.p6 line 13
  in block <unit> at main.p6 line 43

这意味着在执行您代码中的第43行,也就是消息的最后一行时,出现了问题:
my $request = Request.new(:method("GET"), :path("/"), :$host, :$port);

编译器发现执行最后一行代码时,需要通过代码中的另一行,即第13行:
    return self.bless(:$method, :$path, :$version, :$socket);

这有助于更好地定位执行过程中发生错误的代码行。

.bless是一个方法调用。它被调用在self上,self指向传递给该方法的调用者,您可以假设该调用者是出现该方法调用的类的对象,即您正在定义的Request类。

您的代码没有指定Request从哪个类(使用is)继承,因此它继承自AnyAnybless是从Mu继承而来的。

这是Rakudo编译器中此代码

method bless(*%attrinit) {
    nqp::create(self).BUILDALL(Empty, %attrinit);
}

在执行该代码时,Perl 6 尝试读取一些 UTF8,并在它尝试读取的某个 数据 的第一行的第45列遇到了一个无效字符。所以这就是我能够在没有看到你的数据的情况下提供的最好解释。

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