2011-05-21 96 views
2

我试图使用下面一行perl,如下所述:Does anyone know of a vim plugin or script to convert special characters to their corresponding HTML entities? - 在Vim中编码HTML实体。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已经回答了原来的问题,但其他人的评论指出,这是多余的,因为它不是真正需要使用HTML实体,如果你是一个UTF服务页面-8字符集(这我,既与meta标签 -

<meta charset="utf-8"> 

,并在Apache配置:

AddDefaultCharset utf-8 

事实上,在这种情况下添加它们确实是一件坏事;文件大小较大,文本混淆无论如何都要使用源代码。

确保您用来创建文件的任何编辑器都以UTF-8格式编写它是非常重要的。

+0

出于好奇,为什么你在第一时间做这个 – 2011-05-21 11:28:51

+0

我正在学习Vim - 经常需要将Word文档和其他源文件用智能引号,撇号,货币等转换为格式正确的HTML。花了一段时间寻找Vim插件 - 对他们来说似乎并没有太多共识。 (a)很短(b)使用HTML :: Entities,而不是重新发明轮子,很多人似乎都试图去...... – 2011-05-21 11:32:13

+0

啊,够公平的。 (在所有情况的90%中,人们使用实体来解决编码问题,在这种情况下,我的标准答案是“修改编码问题”,因此是我的问题。)问题是,在HTML中,&字符是转义字符为实体。所以每个*真正*符号需要被转义为'&'。不知道在这种情况下修复它的最佳方法是什么,但我不熟悉这些工具 – 2011-05-21 11:33:45

回答

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

我想回应建议只编码真正不安全的字符。 – Anirvan 2011-06-11 17:43:30

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

应该工作,不是吗?

+0

不,首先,猜一猜为什么我使用了'Encode :: decode_utf8'?其次,您正在操作perl的下一个参数,而您需要对给定的文件或stdout进行操作。 – ZyX 2011-05-21 14:45:09

+0

嗯,我把你的-i命令视为理所当然,并且是你Vim所需要的。其次,当我用-n从一个文件进行管道传输时,它确实工作正常。我的意思是你的问题与&,是不是。我确实得到了& – 2011-05-21 15:31:00

+0

@ i-blis 1.我没有通过运行'echo'&'| perl -MHTML :: Entities -i -e'print encode_entities shift'',尽管我可以通过运行'perl -MHTML :: Entities -i -e'print encode_entities shift''&''来获得它们。 2.这不是我的问题。 3.尝试以这种方式对任何多字节Unicode字符进行编码,看看会发生什么(可能取决于Perl版本,我听说过有关最新Perl中unicode更改的内容)。 – ZyX 2011-05-21 15:41:20