26

这是一个快速的 Perl 问题:

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

我从这样的事情开始:

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

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

请注意,我不需要完整的 HTML->文本转换器。我已经用HTML::Parser. 我只需要用我得到的特殊字符转换文本。

4

6 回答 6

56

看看HTML::Entities

use HTML::Entities;

my $html = "Snoopy & Charlie Brown";

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

你可以猜到输出。

于 2009-02-22T23:46:13.420 回答
23

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

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

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

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

# That prints: Bei Jing 
于 2009-02-26T11:18:18.863 回答
7

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

使用 HTML::Entities 的 decode_entities 将实体转换为实际字符。要将其转换为 ASCII 需要更多的工作。我在过去使用了带有音译选项的 iconv(perl 接口:Text::Iconv)并取得了一些成功。但是,如果您正在处理一组有限的实体,或者您实际上不需要将其简化为 ASCII 等价物,您最好限制 decode_entities 生成的内容或为其提供自定义转换映射。请参阅 HTML::Entity 文档。

于 2009-02-23T03:11:05.173 回答
3

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

然而,数字实体的较大情况{会变得更加困难,因为这些值是Unicode,并且转换为 ASCII 的范围从困难不可能

于 2009-02-22T23:47:18.050 回答
0

我使用这个脚本。将其另存为html2utf.pyala 并使用它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')))
于 2020-08-01T22:24:08.810 回答
0

我为 bash 创建了一个单行程序,使用 Perl 来解码传递给 perl 的 HTML 实体。我的解决方案是这个答案(见上文)和我上周在commandlinefu.com上找到的东西的混合。

我们大多数使用 Bash 编写代码的人都没有习惯使用echo -n删除\n换行符,因为它通常不会影响 Bash 文本解析。使用 Perl——以及这种特殊的方法——使用它很重要,echo -n否则 perl 会将“换行”\n字符解释为响应的文字部分,%0A从而在结果中添加不需要的字符。

这是我的 bash-perl 单线混合:

encodedURL="$(echo -n "$entityURL" | perl -MHTML::Entities -MURI::Escape -ne 'print uri_escape(decode_entities($_))')"

例子:

输入:Seals \& Croft - Summer Breeze

输出:Seals%20%26%20Croft%20-%20Summer%20Breeze

于 2022-02-05T08:37:46.590 回答