HTML ::实体编码和单&符号

时间:2011-05-21 11:17:14

标签: html perl vim cpan

我正在尝试使用以下perl行,如下所述:Does anyone know of a vim plugin or script to convert special characters to their corresponding HTML entities? - 在Vim中对HTML实体进行编码。

%!perl -p -i -e 'BEGIN { use HTML::Entities; use Encode; } $_=Encode::decode_utf8($_) unless Encode::is_utf8($_);  $_=Encode::encode("ascii", $_, sub{HTML::Entities::encode_entities(chr shift)});'

它的工作正常(英镑和英镑,弯曲的报价等)除了它自己的&符号外 - & - 保持不变。

我尝试删除uf8解码,并查看了HTML :: Entities的CPAN文档。

答案:

@ZyX回答了原来的问题,但正如其他人在评论中指出的那样,这是多余的,因为如果你使用UTF-8字符集(我是,两者都带有元标记 -

<meta charset="utf-8">

以及Apache配置:

AddDefaultCharset utf-8

事实上,在这种情况下添加它们可能是件坏事;如果想要使用源代码,文件大小更大,文本被混淆。

您必须确保用于创建文件的编辑器也以UTF-8编写它们。

2 个答案:

答案 0 :(得分:2)

我的回答是只编码高于ascii范围的字符。如果要将某些内容编码为html,则应使用

$text=HTML::Entities::encode_entities($text);

%!perl -MHTML::Entities -MEncode -p -i -e '$_=Encode::decode_utf8($_) unless Encode::is_utf8($_); $_=HTML::Entities::encode_entities($_);'

我没有在那个答案中使用这个,因为TS只要求编码unicode字符而不编码<>&

顺便说一句,您可以使用$text=HTML::Entities::encode_entities($text, '<>&"');仅对非常不安全的字符进行编码(尽管我猜这很容易用vimscript表示:

:let entities={'<': 'lt', '>': 'gt', '&': 'amp', '"': 'quot'}
:execute '%s/['.escape(join(keys(entities), ''), '\-]^').']/\="&".entities[submatch(0)].";"/g'

答案 1 :(得分:-1)

perl -MHTML::Entities -i -e 'print encode_entities shift'

应该有效,不是吗?