Perl 6错误:格式错误的UTF-8

7hs*_*hsk 5 http utf-8 perl6

现在,我正在学习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
Run Code Online (Sandbox Code Playgroud)

我认为它来自port变量,但我不确定这是我所有的perl6代码:

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);
Run Code Online (Sandbox Code Playgroud)

rai*_*iph 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
Run Code Online (Sandbox Code Playgroud)

这意味着在执行消息的最后一行,代码的第43行,出现了问题:

my $request = Request.new(:method("GET"), :path("/"), :$host, :$port);
Run Code Online (Sandbox Code Playgroud)

编译器注意到最后一行的执行涉及到代码中另一行的路径,第13行:

    return self.bless(:$method, :$path, :$version, :$socket);
Run Code Online (Sandbox Code Playgroud)

这样有助于在执行错误的过程中更好地确定线路.

.bless是方法调用.它被调用,self它引用传递给方法的调用,你可以假设它是方法调用出现的类的对象,即你定义的类Request.

您的代码没有指定Request继承自(使用is)的类,因此它继承自Any.将bless用于Any从继承Mu.

这是Rakudo编译器中的代码:

method bless(*%attrinit) {
    nqp::create(self).BUILDALL(Empty, %attrinit);
}
Run Code Online (Sandbox Code Playgroud)

因此,在执行该代码期间,Perl 6尝试读取某些UTF8,并在它尝试读取的某些数据的第一行的第45行遇到无效字符.

所以,在没有看到您的数据的情况下,我能说出最好的原因.