如何解码HTML实体?

时间:2009-02-22 23:41:57

标签: html perl ascii special-characters

这是一个快速的Perl问题:

如何将ü'等HTML特殊字符转换为普通的ASCII文本?

我从这样的事情开始:

s/\&#(\d+);/chr($1)/eg;

并且可以为所有HTML字符编写它,但是这样的某些功能可能已经存在了?

请注意,我不需要完整的HTML->文本转换器。我已使用HTML::Parser解析HTML。我只需要用我正在获得的特殊字符转换文本。

5 个答案:

答案 0 :(得分:50)

看看HTML::Entities

use HTML::Entities;

my $html = "Snoopy & Charlie Brown";

print decode_entities($html), "\n";

你可以猜出输出。

答案 1 :(得分:21)

以上答案告诉您如何将实体解码为Perl字符串,但您还询问了如何将这些实体更改为 ASCII

假设这真的是你想要的,并且你不想要所有的unicode字符,你可以从CPAN查看Text::Unidecode模块,将所有这些奇怪的字符重新转换成大致相似的ASCII字符集合:

use Text::Unidecode qw(unidecode);
use HTML::Entities qw(decode_entities);

my $source = '北亰';  
print unidecode(decode_entities($source));

# That prints: Bei Jing 

答案 2 :(得分:6)

请注意,也有十六进制指定的字符。它们看起来像这样:é (E)。

使用HTML :: Entities的decode_entities将实体转换为实际字符。要将其转换为ASCII需要更多工作。我用过iconv(perl接口:Text :: Iconv) 与音译选项在过去取得了一些成功。但如果你正在交易 使用有限的实体集,或者您实际上并不需要将其缩减为ASCII等价物, 你可能最好限制decode_entities生成或提供自定义 转换图。请参阅HTML ::实体文档。

答案 3 :(得分:3)

有一些预定义的HTML实体 - & " >等等 - 您可以进行硬编码。

但是,较大的数字实体 - { - 会更加困难,因为这些值为Unicode,转换为ASCII的范围将从困难 不可能

答案 4 :(得分:0)

我使用此脚本。将其另存为html2utf.py,并在echo $some_html | html2utf.py中使用。

#!/usr/bin/env python3
"""
An alternative for `perl -Mopen=locale -MHTML::Entities -pe '$_ = decode_entities($_)'` (which you can use by `cpanm HTML::Entities`) and `recode html..`.
"""

import fileinput
import html

for line in fileinput.input():
    print(html.unescape(line.rstrip('\n')))