首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML::实体格式化问题?

HTML::实体格式化问题?
EN

Stack Overflow用户
提问于 2017-03-21 11:08:56
回答 1查看 70关注 0票数 0

我试图在perl中解码HTML字符和\u字符。所以我试了下一个

代码语言:javascript
复制
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&euro; e

我预计输出是

代码语言:javascript
复制
sympa et compéten câble 19€ some data

但是,当我使用HTML::实体运行脚本时,它会给出如下结果,

代码语言:javascript
复制
sympa et compéten câble 19€ e

以上输出的unicode字符都是错误格式化的。

当我对HTML::实体进行注释时,它会给出以下结果:

代码语言:javascript
复制
sympa et compéten câble 19&euro; e

以上输出实体字符均未格式化。

我不知道这有什么问题。

我也尝试过单字符替换(作为相同的RegEx替换)。

代码语言:javascript
复制
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字符呢?

我怎么才能修好它?

EN

回答 1

Stack Overflow用户

发布于 2017-03-21 20:41:31

chr内置函数已经返回Perl内部编码中的Unicode字符,因此在这里使用encode是不正确的。如果有的话,您将解码您的输入数据,但在这里也是不正确的。

我删除了对encode的调用,还做了其他一些小的更改,比如对整个字符串调用decode_entities,而不是通过可执行的替换来选择性地调用。

代码语言:javascript
复制
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&euro; e

输出:

代码语言:javascript
复制
sympa et compéten câble 19€ e
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42925367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档