5

Android có hai cách khác nhau để thoát khỏi/mã hóa HTML nhân vật/thực thể trong Strings:Sự khác nhau giữa Html.escapeHtml và TextUtils.htmlEncode của Android là gì? Khi nào tôi nên sử dụng cái này hay cái kia?

  • Html.escapeHtml(String), bổ sung trong API 16 (Android 4.1). Các tài liệu nói:

    Trả về một biểu diễn thoát HTML của văn bản thuần nhất định.

  • TextUtils.htmlEncode(String) Đối với cái này, các tài liệu nói:

    Html mã hóa chuỗi.

Đọc các tài liệu, cả hai đều có vẻ làm được khá nhiều điều tương tự, nhưng, khi kiểm tra họ, tôi nhận được một số (với tôi) đầu ra khá bí ẩn.

Ví dụ: Với đầu vào: <p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>

  • Html.escapeHtml cho:

    &lt;p&gt;This is a quote ". This is a euro symbol: &#8364;. &lt;b&gt;This is some bold text&lt;/b&gt;&lt;/p&gt; 
    
  • Trong khi TextUtils.htmlEncode cho:

    &lt;p&gt;This is a quote &quot;. This is a euro symbol: €. &lt;b&gt;This is some bold text&lt;/b&gt;&lt;/p&gt; 
    

Vì vậy, dường như thoát thứ hai/mã hóa các trích dẫn ("), nhưng đầu tiên không, mặc dù đầu tiên mã hóa biểu tượng Euro, nhưng thứ hai thì không. Tôi bối rối.


Vậy sự khác nhau giữa hai phương pháp này là gì? Mỗi ký tự nào thoát/mã hóa? Sự khác biệt giữa mã hóa thoát là gì ở đây? Khi nào tôi nên sử dụng cái này hay cái kia (hoặc tôi nên, thở hổn hển, sử dụng chúng cùng nhau?)?

Trả lời

8

Bạn có thể so sánh các nguồn của họ:

Đây là những gì Html.escapeHtml sử dụng bên dưới:

https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/core/java/android/text/Html.java#L387

Đây là TextUtils.htmlEncode:

https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/core/java/android/text/TextUtils.java#L1361

Như bạn thấy, sau này chỉ trích dẫn các ký tự nhất định được dành riêng cho đánh dấu trong HTML, trong khi trước đây cũng mã hóa các ký tự không phải ASCII, vì vậy chúng có thể được biểu diễn bằng ASCII.

Vì vậy, nếu đầu vào của bạn chỉ chứa các ký tự Latinh (thường không khả thi ngày nay), hoặc bạn đã thiết lập Unicode trong trang HTML của mình đúng cách và có thể đi cùng với TextUtils.htmlEncode.Trong khi đó nếu bạn cần đảm bảo rằng văn bản của bạn hoạt động ngay cả khi được truyền qua các kênh 7 bit, hãy sử dụng Html.escapeHtml.

Đối với việc xử lý khác nhau của ký tự trích dẫn (") - chỉ cần thoát trong giá trị thuộc tính (xem the spec), vì vậy nếu bạn không đặt văn bản ở đó, bạn sẽ ổn.

Do đó, lựa chọn cá nhân của tôi sẽ là Html.escapeHtml, vì nó có vẻ linh hoạt hơn.

+0

Xin cảm ơn, đặc biệt là để giải thích về mọi thứ khi nào nên sử dụng cái gì và tại sao, đó là điều tôi không chắc chắn. +1. – JonasCz

+0

Cảm ơn bạn đã tham khảo và giải thích –

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