2011-02-09 10 views
6

Khi xuất chuỗi trong HTML, người ta phải thoát khỏi các ký tự đặc biệt dưới dạng thực thể HTML ("& <>" v.v.) vì lý do dễ hiểu.Khi thoát chuỗi bằng các thực thể HTML, tôi có thể bỏ qua các ký tự mã hóa trên Unicode 127 một cách an toàn nếu tôi sử dụng UTF-8 không?

Tôi đã kiểm tra hai triển khai Java này: org.apache.commons.lang.StringEscapeUtils.escapeHtml (String) net.htmlparser.jericho.CharacterReference.encode (CharSequence)

Cả hai thoát khỏi tất cả các nhân vật ở trên mã Unicode điểm 127 (0x7F), có hiệu quả tất cả các ký tự không phải tiếng Anh.

Hành vi này là tốt, nhưng các chuỗi nó tạo ra không phải là con người có thể đọc được khi các ký tự không phải là tiếng Anh (ví dụ: bằng tiếng Do Thái hoặc tiếng Ả Rập). Tôi đã thấy rằng khi các ký tự trên Unicode 127 không được thoát như thế này, chúng vẫn hiển thị chính xác trong các trình duyệt - tôi tin rằng điều này là do trang html được mã hoá UTF-8 và do đó các ký tự này dễ hiểu đối với trình duyệt.

Câu hỏi của tôi: Tôi có thể tắt an toàn các ký tự Unicode trên điểm mã 127 khi thoát khỏi thực thể HTML, miễn là trang web của tôi được mã hóa UTF-8 không?

Trả lời

5

Bạn chỉ cần sử dụng các thực thể HTML dưới hai trường hợp:

  • Để thoát khỏi một nhân vật mà có một ý nghĩa đặc biệt trong HTML (ví dụ <)
  • Để hiển thị ký tự không thuộc về mã hóa tài liệu (ví dụ: biểu tượng trong tài liệu ISO-8859-1)

Do UTF-8 có thể đại diện cho tất cả các ký tự Unicode, chỉ áp dụng trường hợp đầu tiên.

Khi nhập HTML theo cách thủ công, bạn có thể thấy thực tế để chèn thực thể HTML ngay bây giờ và sau đó nếu trình chỉnh sửa và/hoặc bàn phím của bạn sẽ không cho phép bạn nhập một ký tự nhất định (chỉ cần nhập &copy; thay vì cố gắng tìm hiểu cách thức để nhập văn bản © thực tế) nhưng khi thoát văn bản tự động, bạn chỉ cần tăng kích thước trang ;-)

Tôi biết rất ít về Java nhưng các ngôn ngữ khác có chức năng mã hóa ký tự đặc biệt và tất cả các thực thể có thể.

4

Nếu gửi bạn mã hóa trong tiêu đề mime-type:

Content-Type: text/html; charset=utf-8 

sau đó trình duyệt sẽ giải thích nguồn của bạn như UTF-8 và bạn có thể gửi tất cả những nhân vật như UTF-8 byte mã hóa bình thường .

Ngoài ra, bạn có thể chỉ định mã hóa trong tiêu đề của trang HTML của bạn như thế này:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

này có ưu điểm là các thông tin được lưu trữ với các trang HTML nếu két sử dụng nó và mở cửa lại nó từ đĩa cứng của mình sau đó.

Cá nhân tôi muốn làm cả hai (gửi tiêu đề phù hợp và thêm meta -tag vào trang HTML của bạn). Nó sẽ được miễn là miễn là hai nơi đồng ý về việc mã hóa.

Cập nhật: HTML 5 đã được thêm vào a new syntax for specifying the encoding:

<meta charset="utf-8">