在C:/Strawberry/perl/lib/Carp.pm第324行格式错误的UTF-8字符(致命)

时间:2016-10-11 02:20:29

标签: perl utf-8

这是我的源代码:

use strict;
use warnings;
use diagnostics;
use utf8::all;

print join ' ',map{as_code_point($_)}sort qw/b 1 a A 日 本 国/;

sub as_code_point{
    my $char=shift;
    die"Only characters!"if length($char)>1;

    return "U+".uc sprintf "%04x",ord $char;
}

我不知道出了什么问题。我需要你的帮助。

2 个答案:

答案 0 :(得分:3)

该问题表明标量包含无效值。当源不使用UTF-8进行编码时会发生这种情况,但是您告诉Perl它是(因为它不执行有效性检查。)

如果文件编码正确,则不会出现此问题。

$ perl a.pl | perl
U+0031 U+0041 U+0061 U+0062 U+56FD U+65E5 U+672C

a.pl

use strict;
use warnings;
use utf8::all;

my $chars = qq{qw/b 1 a A \x{65E5} \x{672C} \x{56FD}/};

while (<DATA>) {
    s/<<<CHARS>>>/$chars/g;
    print;
}

__DATA__
use strict;
use warnings;
use diagnostics;
use utf8::all;

print join ' ',map{as_code_point($_)}sort <<<CHARS>>>;
print "\n";

sub as_code_point{
    my $char=shift;
    die"Only characters!"if length($char)>1;

    return "U+".uc sprintf "%04x",ord $char;
}

答案 1 :(得分:1)

我敢打赌,utf8::all正在做一些破坏Carp模块加载的事情。第一步是查看您的Carp版本是否确实出现了问题。尝试针对C:/Strawberry/perl/lib/Carp.pm

运行此操作
perl -Mbytes -ne "printf qq/%02x [$_]\n/, ord for grep { ord > 127 } split //" C:/Strawberry/perl/lib/Carp.pm

您可能必须第二次逃离\(我没有要测试的Windows机器)。

这应该可以让您了解其中的非ASCII字节。检查这些字节是否有效UTF-8(您可以使用默认为Window的本机UTF-16的编辑器打开并保存文件。)

另一种选择是看看它抱怨的那条线:

perl -ne 'print if $. == 324' C:/Strawberry/perl/lib/Carp.pm

有什么看起来很有趣吗?您还应该检查文件上的修改日期。它和其他核心模块一样吗?如果没有,则可能已编辑过。

如果没有发现问题,请摆脱use utf8::all;并慢慢手动添加功能。