这是一个快速的Perl问题:
我该如何将HTML特殊字符(如ü
或'
)转换为普通的ASCII文本?
我从以下代码开始尝试:
s/\&#(\d+);/chr($1)/eg;
我可以为所有HTML字符编写它,但是可能已经存在一些类似的函数?
请注意,我不需要完整的HTML->文本转换器。 我已经使用HTML::Parser
解析了HTML。 我只需要转换我得到的特殊字符的文本。
这是一个快速的Perl问题:
我该如何将HTML特殊字符(如ü
或'
)转换为普通的ASCII文本?
我从以下代码开始尝试:
s/\&#(\d+);/chr($1)/eg;
我可以为所有HTML字符编写它,但是可能已经存在一些类似的函数?
请注意,我不需要完整的HTML->文本转换器。 我已经使用HTML::Parser
解析了HTML。 我只需要转换我得到的特殊字符的文本。
看一下HTML::Entities:
use HTML::Entities;
my $html = "Snoopy & Charlie Brown";
print decode_entities($html), "\n";
您可以猜测输出结果。use Text::Unidecode qw(unidecode);
use HTML::Entities qw(decode_entities);
my $source = '北亰';
print unidecode(decode_entities($source));
# That prints: Bei Jing
有一些预定义的HTML实体 - &
"
>
等 - 您可以硬编码。
但是,更大量的数字实体 - {
- 将会更加困难,因为这些值是Unicode,转换为ASCII将从难以到不可能范围内。
我已经创建了一个基于Perl的Bash单行命令,用于解码传递给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
我使用这个脚本。将其保存为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')))
perl -MHTML::Entities -le 'print decode_entities("¿'")
- Brian Duncan