2011-05-21 83 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