我试图在perl中解码HTML字符和\u字符。所以我试了下一个
use Encode;
use HTML::Entities;
my $cont= do{local $/; <DATA> };
$cont=Remove_Spaces($cont);
print "$cont\n";
sub Remove_Spaces
{
my $clean=shift;
$clean =~s/\\u00(\w{2})/encode("utf-8",chr(hex($1)))/egs;
#$clean=~s/(\&\#?\w+\;)/decode_entities($1)/egs;
$clean=~s/^\s+|\s+$//igs;
$clean=~s/\s+/ /igs;
return $clean;
}
__DATA__
sympa et comp\u00e9ten c\u00e2ble 19€ e我预计输出是
sympa et compéten câble 19€ some data但是,当我使用HTML::实体运行脚本时,它会给出如下结果,
sympa et compéten câble 19€ e以上输出的unicode字符都是错误格式化的。
当我对HTML::实体进行注释时,它会给出以下结果:
sympa et compéten câble 19€ e以上输出实体字符均未格式化。
我不知道这有什么问题。
我也尝试过单字符替换(作为相同的RegEx替换)。
sub Remove_Spaces
{
my $clean=shift;
$clean=~s/\s*<[^>]*?>\s*/ /igs;
while($clean=~m/(\&\#?\w+\;)/igs)
{
my $find = $1;
my $replace = decode_entities($find);
my $pos = index($clean, $find);
while($pos > -1)
{
substr($clean, $pos, length($find), $replace);
$pos = index($clean, $find, $pos + length($replace));
}
}
while($clean=~m/(\\u00(\w{2}))/igs)
{
my $find = $1;
my $replace = encode("utf8",chr(hex($2)));
#print ord($replace),"\t$replace***\n";
my $pos = index($clean, $find);
while($pos > -1)
{
substr($clean, $pos, length($find), $replace);
$pos = index($clean, $find, $pos + length($replace));
}
}
$clean=~s/^\s+|\s+$//igs;
$clean=~s/\s+/ /igs;
return $clean;
}在上面的代码中,我只使用substr替换了一个字符。那么为什么会影响\u字符呢?
我怎么才能修好它?
发布于 2017-03-21 20:41:31
chr内置函数已经返回Perl内部编码中的Unicode字符,因此在这里使用encode是不正确的。如果有的话,您将解码您的输入数据,但在这里也是不正确的。
我删除了对encode的调用,还做了其他一些小的更改,比如对整个字符串调用decode_entities,而不是通过可执行的替换来选择性地调用。
use strict;
use warnings;
use HTML::Entities;
sub Remove_Spaces {
my $clean = shift;
$clean =~ s/\\u00(\w{2})/chr(hex($1))/eg; # match should probably be: ([0-9a-f]{2})
$clean =~ s/^\s+|\s+$//g;
$clean =~ s/\s+/ /g;
return decode_entities($clean);
}
my $cont = do { local $/; <DATA> };
$cont = Remove_Spaces($cont);
binmode(STDOUT, ':encoding(utf8)'); # avoid 'wide character in print' warnings
print "$cont\n";
__DATA__
sympa et comp\u00e9ten c\u00e2ble 19€ e输出:
sympa et compéten câble 19€ ehttps://stackoverflow.com/questions/42925367
复制相似问题