2009-02-22 22 views
21

Đây là câu hỏi Perl nhanh:Tôi làm cách nào để giải mã các thực thể HTML?

Làm cách nào để chuyển đổi các ký tự đặc biệt HTML như ü hoặc ' thành văn bản ASCII bình thường?

tôi bắt đầu với một cái gì đó như thế này:

s/\&#(\d+);/chr($1)/eg; 

và có thể viết nó cho tất cả các ký tự HTML, nhưng một số chức năng như thế này có lẽ đã tồn tại?

Lưu ý rằng tôi không cần một trình chuyển đổi văn bản HTML đầy đủ. Tôi đã phân tích cú pháp HTML với HTML::Parser. Tôi chỉ cần chuyển đổi văn bản với các ký tự đặc biệt mà tôi nhận được.

Trả lời

47

Hãy xem HTML::Entities:

use HTML::Entities; 

my $html = "Snoopy & Charlie Brown"; 

print decode_entities($html), "\n"; 

Bạn có thể đoán ra.

+1

Đối với những người thích CLI một lớp lót: 'perl -MHTML :: Entities -le 'in decode_entities (" & iquest; ' ")' –

3

Có một số ít các thực thể HTML được xác định trước - &"> và v.v. - bạn có thể mã cứng.

Tuy nhiên, trường hợp lớn hơn của các tổ chức numberic - { - sẽ là khó khăn hơn nhiều, như những giá trị này là Unicode, và chuyển đổi sang ASCII sẽ dao động từ khó-không thể.

+0

Khá đúng, Bevan. Không có thứ gì như một bản dịch ngược từ Unicode thành "ASCII thuần túy". Joel đã viết một bài viết thực sự tốt về mã hóa văn bản, dehmann nên đọc nó ... – AmbroseChapel

+1

http://www.joelonsoftware.com/articles/Unicode.html 'Tất cả những thứ về "văn bản thuần túy = ascii = ký tự là 8 bit" là không chỉ sai, nó vô vọng sai, và nếu bạn vẫn còn lập trình theo cách đó, bạn không tốt hơn nhiều so với một bác sĩ y khoa không tin vào vi trùng. ' – AmbroseChapel

+1

Perl: ... tạo ra những điều khó khăn nhất có thể – daxim

6

Lưu ý rằng cũng có các ký tự được chỉ định bằng hex. Họ trông như thế này: & # xe9; (é).

Sử dụng HTML :: Entities 'decode_entities để dịch thực thể thành ký tự thực. Để chuyển đổi thành ASCII, yêu cầu nhiều công việc hơn. Tôi đã sử dụng iconv (giao diện perl: Text :: Iconv) với tùy chọn chuyển ngữ với một số thành công trong quá khứ. Nhưng nếu bạn đang xử lý với một tập hợp các thực thể hạn chế, hoặc bạn không thực sự cần nó giảm xuống tương đương ASCII, bạn có thể nên hạn chế những gì decode_entities tạo hoặc cung cấp nó với các bản đồ chuyển đổi tùy chỉnh . Xem HTML :: Entities doc.

20

Các câu trả lời ở trên cho bạn biết cách giải mã các thực thể thành chuỗi Perl, nhưng bạn cũng đã hỏi cách thay đổi chúng thành ASCII.

Giả sử rằng đây thực sự là những gì bạn muốn và bạn không muốn tất cả các ký tự unicode bạn có thể nhìn vào các mô-đun Text::Unidecode từ CPAN để Zap tất cả những nhân vật kỳ quặc trở thành một bộ sưu tập khoảng tương tự của các ký tự ASCII:

use Text::Unidecode qw(unidecode); 
use HTML::Entities qw(decode_entities); 

my $source = '北亰'; 
print unidecode(decode_entities($source)); 

# That prints: Bei Jing 
Các vấn đề liên quan