HTML::实体编码和单与号



>我正在尝试使用以下 perl 行,如下所述: 有谁知道将特殊字符转换为其相应 HTML 实体的 vim 插件或脚本? - 在 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::实体的 CPAN 文档。

答:

@ZyX已经回答了最初的问题,但正如其他人在评论中指出的那样,这是多余的,因为如果您提供带有 UTF-8 字符集的页面(我是,两者都带有元标记 -

<meta charset="utf-8">

以及在 Apache 配置中:

AddDefaultCharset utf-8

事实上,在这种情况下添加它们可以说是一件坏事;文件大小更大,文本被混淆,无论如何都应该使用源代码。

确保用于

创建文件的任何编辑器也以 UTF-8 编写文件,这一点至关重要。

我的答案只是编码高于 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'
perl -MHTML::Entities -i -e 'print encode_entities shift'

应该可以工作,不是吗?

最新更新