2010-01-20 37 views
19

Tôi đang tìm một cách đơn giản để mã hóa HTML một chuỗi/đối tượng trong Perl. Các gói bổ sung ít được sử dụng tốt hơn.Tôi làm cách nào để mã hóa chuỗi cho HTML?

+2

Chính xác bạn có ý nghĩa gì với "HTML encode"? Bạn có thể đưa ra một ví dụ đầu vào và đầu ra mong muốn? – cjm

+1

Bạn cần xử lý bộ ký tự/ngôn ngữ nào? – pilcrow

Trả lời

29

HTML::Entities là bạn của bạn ở đây.

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

Bạn cần mã hóa, chuỗi hoặc đối tượng nào? Nếu nó chỉ là một chuỗi, sau đó bạn chỉ cần phải lo lắng về các vấn đề mã hóa như UTF-8, và CGI::escape có thể sẽ làm các trick cho bạn. Nếu đó là một đối tượng, trước tiên bạn sẽ cần serialize nó, mở ra một tập hợp các vấn đề hoàn toàn mới, nhưng bạn có thể muốn xem xét JSON-mã hóa nó.

PS. Mặc dù tôi không thể tìm thấy bất kỳ tài liệu nào gần đây về phương pháp này (nó thực sự được nhập từ CGI::Util và được đánh dấu là "nội bộ"), bạn có thể sử dụng escapeHTML() như daxim chỉ ra trong nhận xét của mình: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML

+1

Hàm này được gọi là 'escapeHTML'. Liên kết sâu thích hợp: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML – daxim

+0

@daxim: 'CGI :: escape' tồn tại rất nhiều; nó thực sự được định nghĩa trong CGI :: Util và được nhập vào CGI phù hợp. Nếu bạn nhìn vào nguồn có một số khác biệt tinh tế trong việc thực hiện, điều đáng buồn là không được mô tả rõ trong tài liệu. – Ether

+0

Được rồi. Tôi không thể hoàn tác phiếu bầu vì nó quá cũ. – daxim

27

Khi điều này câu hỏi đầu tiên được trả lời, HTML::Entities là mô-đun mà hầu hết mọi người có thể đã sử dụng. Đó là Perl tinh khiết và theo mặc định sẽ thoát khỏi các ký tự dành riêng cho HTML ><'"& và các ký tự rộng.

Gần đây, HTML::Escape xuất hiện. Nó có cả XS và Perl tinh khiết. Nếu bạn đang sử dụng phiên bản XS, nhanh hơn khoảng 10 lần so với HTML::Entities. Tuy nhiên, nó chỉ trốn thoát ><'"& và không có cách nào để thay đổi các giá trị mặc định. Đây là sự khác biệt với phiên bản XS:

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) 

Và đây là cuộc đấu tranh công bằng với các phiên bản Perl tinh khiết mỗi bên:

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) 

Bạn có thể có được những tiêu chuẩn trong Surveyor::Benchmark::HTMLEntities. Tôi giải thích how I distribute benchmarks sử dụng Surveyor::App.

+0

Với thực tế là 'HTML :: Entities' cũng tìm kiếm các ký tự rộng, cuộc chiến Perl thuần túy có thể không công bằng. Nó có thể là thú vị để thay đổi mã trong phiên bản Perl thuần túy của 'HTML :: Escape' để bao gồm các trường hợp tương tự theo thuật toán riêng của nó và thấy rằng chiến đấu một lần nữa. –

Các vấn đề liên quan