如何为 HTML 编码字符串?
Posted
技术标签:
【中文标题】如何为 HTML 编码字符串?【英文标题】:How can I encode a string for HTML? 【发布时间】:2011-01-07 11:39:37 【问题描述】:我正在寻找一种在 Perl 中对字符串/对象进行 html 编码的简单方法。使用的附加包越少越好。
【问题讨论】:
“HTML 编码”到底是什么意思?你能给出一个示例输入和所需的输出吗? 您必须处理哪些字符集/语言环境? 【参考方案1】:当第一次回答这个问题时,HTML::Entities 是大多数人可能使用的模块。它是纯 Perl,默认情况下会转义 HTML 保留字符 ><'"&
和宽字符。
最近,HTML::Escape 出现了。它既有 XS 又有纯 Perl。如果你使用的是 XS 版本,它比HTML::Entities 快十倍左右。但是,它只会转义><'"&
,并且无法更改默认值。以下是与 XS 版本的区别:
Benchmark: timing 10000 iterations of html_entities, html_escape...
html_entities: 14 wallclock secs (14.09 usr + 0.01 sys = 14.10 CPU) @ 709.22/s (n=10000)
html_escape: 1 wallclock secs ( 0.68 usr + 0.00 sys = 0.68 CPU) @ 14705.88/s (n=10000)
下面是纯 Perl 版本的公平竞争:
Benchmark: timing 10000 iterations of html_entities, html_escape...
html_entities: 14 wallclock secs (13.79 usr + 0.01 sys = 13.80 CPU) @ 724.64/s (n=10000)
html_escape: 7 wallclock secs ( 7.57 usr + 0.01 sys = 7.58 CPU) @ 1319.26/s (n=10000)
您可以在Surveyor::Benchmark::HTMLEntities 中获得这些基准。我用Surveyor::App解释how I distribute benchmarks。
【讨论】:
鉴于HTML::Entities
也寻找宽字符这一事实,纯粹的 Perl 战斗可能并不公平。更改 HTML::Escape
的纯 Perl 版本中的代码以在其自己的算法下包含相同的情况并再次看到战斗可能会很有趣。【参考方案2】:
你需要编码哪个,一个字符串还是一个对象?如果它只是一个字符串,那么您应该只需要担心编码问题,例如 UTF-8,CGI::escape 可能会为您解决问题。如果它是一个对象,您需要先对其进行序列化,这会带来一系列全新的问题,但您可能需要考虑JSON-encoding 它。
附言。尽管由于我找不到有关此方法的任何最新文档(它实际上是从 CGI::Util 导入并标记为“内部”),但您可能应该使用 escapeHTML() 正如 daxim 在他的评论中指出的那样:http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML
【讨论】:
函数名为escapeHTML
。正确的深层链接:search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML
@daxim: CGI::escape
非常存在;它实际上在 CGI::Util 中定义并正确导入到 CGI 中。如果您查看源代码,则在实现方面存在一些细微差别,遗憾的是文档中没有很好地描述这些差异。
好的。我无法撤消投票,因为它太旧了。
@daxim:我已经编辑了帖子,所以你可以在投票中获得另一个突破:)【参考方案3】:
HTML::Entities 是你的朋友。
use HTML::Entities;
my $encoded = encode_entities( "foo & bar & <baz>" );
【讨论】:
以上是关于如何为 HTML 编码字符串?的主要内容,如果未能解决你的问题,请参考以下文章