【问题标题】:Perl 6 error: Malformed UTF-8Perl 6 错误:格式错误的 UTF-8
【发布时间】:2018-05-06 22:35:58
【问题描述】:

现在,我正在学习 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

我认为它来自端口变量,但我不确定 这是我所有的 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);

【问题讨论】:

  • 您确定它正在从服务器接收有效的 utf8 数据吗?还有为什么它被命名为toString而不是更有意义的Str
  • 如果您从某处复制并粘贴了该代码,则“/”或其他一些字符可能存在一些编码问题。请确保您的编辑器可以将其保存为 UTF8
  • 我只有 7 到 8 分钟的时间来写我的答案——只够在表面上理解你的代码。我希望它不会那么无用它会让你烦恼或沮丧,但令我惊讶的是你实际上已经接受了它!它真的解释了你需要知道的一切和/或你解决了你的问题吗?当我写完答案时,我注意到我引用的代码是第 42 行,而不是第 43 行,并且“第 1 行第 45 行”令人困惑,因为它是关于数据而不是代码,但它并没有这么说和休息错误消息是代码的 X 行。我很想听听您对错误消息的批评。

标签: http utf-8 raku


【解决方案1】:

这个答案可能没有帮助,可能很烦人,但我可以在今天晚些时候删除它,如果它是我所拥有的,我必须运行。

我不知道你是否理解错误信息,但让我们先介绍一下。

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 上调用,它指的是传递给方法的调用者,您可以假设它是出现方法调用的类的对象,即您定义的类Request

您的代码没有指定Request 继承自哪个类(使用is),因此它继承自AnyAnybless 继承自 Mu's

在 Rakudo 编译器中是 this code

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

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

所以这是我能说的最好的原因,没有看到你的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2016-11-13
    • 2019-02-09
    • 2017-11-20
    • 2014-05-20
    相关资源
    最近更新 更多