В чем разница между 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
дает:<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
В то время как
TextUtils.htmlEncode
дает:<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
Таким образом, кажется, что второй экранирует / кодирует кавычку ("), но первый нет, хотя первый кодирует символ евро, а второй нет. Я запутался.
Так в чем же разница между этими двумя методами? Какие символы каждый экранирует / кодирует? Какая разница между кодированием и экранированием здесь? Когда я должен использовать один или другой (или я должен, задыхаясь, использовать их обоих вместе?)?
1 ответ
Вы можете сравнить их источники:
Это то, что Html.escapeHtml
использует под:
Это TextUtils.htmlEncode
:
Как вы можете видеть, последний цитирует только определенные символы, которые зарезервированы для разметки в HTML, тогда как первый также кодирует символы не ASCII, поэтому они могут быть представлены в ASCII.
Таким образом, если ваш ввод содержит только латинские символы (что обычно маловероятно в настоящее время), или вы правильно настроили Unicode на своей HTML-странице и можете согласиться с TextUtils.htmlEncode
, Принимая во внимание, что если вам нужно убедиться, что ваш текст работает, даже если он передается по 7-битным каналам, используйте Html.escapeHtml
,
Что касается другой обработки символа кавычки ("
) - его необходимо экранировать только внутри значений атрибутов (см. спецификацию), поэтому, если вы не помещаете туда свой текст, все будет в порядке.
Таким образом, мой личный выбор будет Html.escapeHtml
кажется более универсальным.