Escaped html не будет unescaped (теперь: unescaped html не исчезнет)

Итак, я в настоящее время использую общедоступную библиотеку apache.

Когда я попытался отключить эту строку: 😀 Это возвращает ту же строку: 😀

String characters = "😀"
StringEscapeUtils.unescapeHtml(characters);

Выход: 😀

Но когда я попробовал unescaping String с меньшим количеством символов, он работает:

String characters = "㈳"
StringEscapeUtils.unescapeHtml(characters);

Выход: ㈳

Любые идеи? Когда я попытался отключить эту привязку "😀" on онлайн-утилиту unescaping, она работает, возможно, это ошибка в библиотеке apache common langs? Или может кто-нибудь порекомендовать другую библиотеку?

Спасибо.

ОБНОВЛЕНИЕ:

Теперь я могу успешно удалить строку. Проблема теперь в том, что когда я попытался избежать результата этой unescape, она не вернет строку (😀).

Ответ 1

Это символ Юникода, индекс которого U+1F600 (128512) - GRINNING FACE

Подробнее см. URL

Строка, о которой вы упоминали, это HTML Escape из U + 1F600, если вы ее отмените, используя Apache commons lang, она нарисует вам необходимый смайлик, как показано на снимке экрана

Набор символов от U + 0000 до U + FFFF иногда называют базовой многоязычной плоскостью (BMP). Символы, чьи кодовые точки больше U + FFFF, называются дополнительными символами. Платформа Java использует представление UTF-16 в массивах char и в классах String и StringBuffer. В этом представлении дополнительные символы представлены в виде пары значений char, первой из диапазона высоких суррогатов, (\ uD800-\uDBFF), второй из диапазона низких суррогатов (\ uDC00-\uDFFF).

Относительно вашего обновления, что оно не возвращается к 😀

Вы также можете представить символ с помощью числовой ссылки на символ формы & #dddd;, где dddd - это десятичное значение, представляющее скалярное значение символа Unicode. Вы также можете использовать шестнадцатеричное представление & #xhhhh;, где hhhh - шестнадцатеричное значение, эквивалентное десятичному значению.  Хороший сайт для this

Добавили несколько SoP, чтобы лучше понять этот юникод.

enter image description here

Ответ 2

unescapeHtml() оставляет 😀 нетронутым, потому что - как говорится в документации - он только отменяет объекты HTML 4.0, которые ограничены 65 536 символами, К сожалению, 128 512 намного превосходит этот предел.

Пробовали ли вы использовать unescapeXml()?

XML поддерживает до 1,114,111 (10FFFFh) объектов символов (ссылка).

Ответ 3

Хорошо - решение довольно просто: используйте org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4 вместо этого! (если вы не используете Java < 1.5, которого вы, вероятно, не захотите)

String characters = "&#128512;";
StringEscapeUtils.unescapeHtml4(characters);

Ответ 4

Я думаю, проблема в том, что символ Юникода отсутствует "&#128512;" поэтому метод просто возвращает эту строку.

doc функции говорит только

Возвращает: новый unescaped String, нулевой, если нулевой ввод строки

Ответ 5

Если это конкретный вопрос HTML, вы можете просто использовать JavaScript для этой цели. Вы можете сделать

    escape("&#128512;") which gives you %26%23128512%3B
    unescape("%26%23128512%3B") which gives you back &#128512;