这是一个快速的 Perl 问题:
如何将 HTML 特殊字符转换ü
为'
普通的 ASCII 文本?
我从这样的事情开始:
s/\&#(\d+);/chr($1)/eg;
并且可以为所有 HTML 字符编写它,但是可能已经存在一些这样的功能?
请注意,我不需要完整的 HTML->文本转换器。我已经用HTML::Parser
. 我只需要用我得到的特殊字符转换文本。
这是一个快速的 Perl 问题:
如何将 HTML 特殊字符转换ü
为'
普通的 ASCII 文本?
我从这样的事情开始:
s/\&#(\d+);/chr($1)/eg;
并且可以为所有 HTML 字符编写它,但是可能已经存在一些这样的功能?
请注意,我不需要完整的 HTML->文本转换器。我已经用HTML::Parser
. 我只需要用我得到的特殊字符转换文本。
use HTML::Entities;
my $html = "Snoopy & Charlie Brown";
print decode_entities($html), "\n";
你可以猜到输出。
上面的答案告诉您如何将实体解码为 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
请注意,也有十六进制指定的字符。它们看起来像这样: é (e)。
使用 HTML::Entities 的 decode_entities 将实体转换为实际字符。要将其转换为 ASCII 需要更多的工作。我在过去使用了带有音译选项的 iconv(perl 接口:Text::Iconv)并取得了一些成功。但是,如果您正在处理一组有限的实体,或者您实际上不需要将其简化为 ASCII 等价物,您最好限制 decode_entities 生成的内容或为其提供自定义转换映射。请参阅 HTML::Entity 文档。
有一些预定义的 HTML 实体 -&
"
>
等等 - 您可以硬编码。
然而,数字实体的较大情况{
会变得更加困难,因为这些值是Unicode,并且转换为 ASCII 的范围从困难到不可能。
我使用这个脚本。将其另存为html2utf.py
ala 并使用它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')))
我为 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