В чем разница между Html.escapeHtml и TextUtils.htmlEncode для Android? Когда я должен использовать один или другой?

В Android есть два разных способа экранирования / кодирования символов / сущностей HTML в строках:

  • Html.escapeHtml(String), добавлено в API 16 (Android 4.1). Документы говорят:

    Возвращает экранированное представление HTML данного простого текста.

  • TextUtils.htmlEncode(String) Для этого документы говорят:

    HTML-кодирование строки.

Читая документы, они оба, кажется, делают одно и то же, но при тестировании я получаю довольно таинственный (для меня) вывод.

Например. С входом: <p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>

  • Html.escapeHtml дает:

    &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;
    
  • В то время как TextUtils.htmlEncode дает:

    &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;
    

Таким образом, кажется, что второй экранирует / кодирует кавычку ("), но первый нет, хотя первый кодирует символ евро, а второй нет. Я запутался.


Так в чем же разница между этими двумя методами? Какие символы каждый экранирует / кодирует? Какая разница между кодированием и экранированием здесь? Когда я должен использовать один или другой (или я должен, задыхаясь, использовать их обоих вместе?)?

1 ответ

Решение

Вы можете сравнить их источники:

Это то, что Html.escapeHtml использует под:

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

Это TextUtils.htmlEncode:

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

Как вы можете видеть, последний цитирует только определенные символы, которые зарезервированы для разметки в HTML, тогда как первый также кодирует символы не ASCII, поэтому они могут быть представлены в ASCII.

Таким образом, если ваш ввод содержит только латинские символы (что обычно маловероятно в настоящее время), или вы правильно настроили Unicode на своей HTML-странице и можете согласиться с TextUtils.htmlEncode, Принимая во внимание, что если вам нужно убедиться, что ваш текст работает, даже если он передается по 7-битным каналам, используйте Html.escapeHtml,

Что касается другой обработки символа кавычки (") - его необходимо экранировать только внутри значений атрибутов (см. спецификацию), поэтому, если вы не помещаете туда свой текст, все будет в порядке.

Таким образом, мой личный выбор будет Html.escapeHtmlкажется более универсальным.

Другие вопросы по тегам