2010-01-20 19 views
19

HTML'de Perl'de bir dize/nesneyi kodlamanın basit bir yolunu arıyorum. Daha az ek paket daha iyiydi.HTML için bir dizeyi nasıl kodlayabilirim?

+2

"HTML encode" ile tam olarak ne demek istiyorsunuz? Örnek bir giriş ve istenen çıktı verebilir misiniz? – cjm

+1

Hangi karakter kümeleri/yerel ayarlamalar yapmanız gerekiyor? – pilcrow

cevap

29

HTML::Entities arkadaşın burada. Eğer bir dize veya bir nesneyi kodlamak gerekiyor

use HTML::Entities; 
my $encoded = encode_entities("foo & bar & <baz>"); 
4

? Sadece bir dize ise, o zaman UTF-8 ve CGI::escape gibi kodlama sorunları hakkında endişelenmeniz gerekir, muhtemelen sizin için hile yapacaktır. Eğer bir nesne ise, önce serileştirmeniz gerekecek, bu da yepyeni bir dizi meseleyi ortaya çıkarır, ancak JSON'u kodlamak isteyebilirsiniz.

PS. Bu yöntemle ilgili herhangi bir yeni belge bulamadığım halde (aslında CGI::Util'dan içe aktarılır ve "internal" olarak işaretlenir), muhtemelen escapeHTML() yöntemini, yorumunda daxim noktaları olarak kullanmanız gerekir: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML

+1

Fonksiyon "escapeHTML" olarak adlandırıldı. Doğru derin bağlantı: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML – daxim

+0

@daxim: "CGI :: escape" çok fazla var; Aslında CGI :: Util'de tanımlanmış ve CGI'ya uygun şekilde aktarılmıştır. Kaynağa bakarsanız, uygulamada ne yazık ki iyi tanımlanmamış bazı ince farklılıklar vardır. – Ether

+0

Tamam. Oylamayı geri alamıyorum çünkü çok yaşlı. – daxim

27

soru ilk cevaplandı, HTML::Entities muhtemelen en çok kullanılan modül oldu. Bu saf Perl ve varsayılan olarak ><'"& kodlu HTML karakterleri ve geniş karakterler kaçacaktır.

Son zamanlarda, HTML::Escape ortaya çıktı. Hem XS hem de saf Perl var. XS sürümünü kullanıyorsanız, HTML::Entities'dan yaklaşık on kat daha hızlıdır. Ancak, yalnızca ><'"&'dan kaçar ve varsayılanları değiştirmenin bir yolu yoktur.

Benchmark: timing 10000 iterations of html_entities, html_escape... 
html_entities: 14 wallclock secs (14.09 usr + 0.01 sys = 14.10 CPU) @ 709.22/s (n=10000) 
html_escape: 1 wallclock secs (0.68 usr + 0.00 sys = 0.68 CPU) @ 14705.88/s (n=10000) 

Ve burada her iki tarafta saf Perl sürümleri ile adil bir dövüş: Burada XS sürümü ile fark bu

Benchmark: timing 10000 iterations of html_entities, html_escape... 
html_entities: 14 wallclock secs (13.79 usr + 0.01 sys = 13.80 CPU) @ 724.64/s (n=10000) 
html_escape: 7 wallclock secs (7.57 usr + 0.01 sys = 7.58 CPU) @ 1319.26/s (n=10000) 

Sen Surveyor::Benchmark::HTMLEntities yılında bu kriterleri alabilirsiniz. 'u Surveyor::App kullanarak açıklarım.

+0

HTML :: Entities'in de geniş karakterler aradığı göz önüne alındığında, saf Perl dövüşü bu kadar adil olmayabilir. Aynı olayları kendi algoritması altında içermek için 'HTML :: Escape' in saf Perl versiyonundaki kodu değiştirmek ilginç olabilir ve bunu tekrar ele alın. –

İlgili konular