>我正在尝试使用以下 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'
应该可以工作,不是吗?