【问题标题】:How can I decode HTML entities?如何解码 HTML 实体?
【发布时间】:2009-02-22 23:41:56
【问题描述】:

这是一个关于 Perl 的快速问题:

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

我是这样开始的:

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

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

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

【问题讨论】:

    标签: html perl ascii special-characters


    【解决方案1】:

    看看HTML::Entities

    use HTML::Entities;
    
    my $html = "Snoopy & Charlie Brown";
    
    print decode_entities($html), "\n";
    

    你可以猜到输出。

    【讨论】:

    • 喜欢 CLI one liner 的朋友:perl -MHTML::Entities -le 'print decode_entities("¿'")
    • 很好的答案 - 这对我的工作有帮助!
    【解决方案2】:

    上面的答案告诉你如何将实体解码为 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 
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 完全正确,贝文。没有从 Unicode 到“纯 ASCII”的反向翻译。 Joel 写了一篇关于文本编码的非常好的文章,dehmann 应该阅读它...
        • joelonsoftware.com/articles/Unicode.html '所有关于“纯文本 = ascii = 字符是 8 位”的东西不仅是错误的,而且是无可救药的错误,如果你还在这样编程,你就不是比不相信细菌的医生要好得多。'
        • Perl:……让困难的事情成为可能
        【解决方案5】:

        我使用这个脚本。将其保存为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')))
        

        【讨论】:

          【解决方案6】:

          我已经为 bash 创建了一个单行代码,使用 Perl 来解码传递给 perl 的 HTML 实体。我的解决方案是this answer(见上文)和我上周在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

          【讨论】:

            猜你喜欢
            • 2012-01-21
            • 2012-05-26
            • 2014-10-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多