HTML-энтити кодировщик / декодировщик/ & < > "

Кодирование специальных HTML-символов в сущности и декодирование именованных/числовых сущностей — незаменимый инструмент для предотвращения XSS.

Обычный текст / HTML
0 симв.
HTML-сущности
0 симв.
Частые HTML-сущности
&&
<&lt;
>&gt;
"&quot;
'&#39;
©&copy;
®&reg;
&trade;
&nbsp;
&mdash;
&hellip;
«»&laquo;&raquo;

Этот инструмент решил вашу проблему?

Что такое инструмент кодирования/декодирования HTML

Инструмент кодирования/декодирования HTML преобразует между обычным текстом и HTML-сущностями. HTML-сущности — это специальные коды, начинающиеся с & и заканчивающиеся ;, для безопасного отображения спецсимволов.

Распространённые сценарии использования

Отображение фрагментов кода: кодировать < и > как &lt; и &gt;. Предотвращение XSS-атак: кодировать пользовательский ввод перед отображением. Шаблоны писем: безопасное отображение спецсимволов в HTML-письмах.

Примеры кода

JavaScript (Browser)
// Encode using a temporary DOM element (browser only)
function htmlEncode(str) {
  const div = document.createElement('div');
  div.appendChild(document.createTextNode(str));
  return div.innerHTML;
}

// Decode
function htmlDecode(str) {
  const div = document.createElement('div');
  div.innerHTML = str;
  return div.textContent ?? div.innerText;
}

// Manual encode (works in Node.js too)
const escapeHtml = (s) => s
  .replace(/&/g, '&amp;')
  .replace(/</g, '&lt;')
  .replace(/>/g, '&gt;')
  .replace(/"/g, '&quot;')
  .replace(/'/g, '&#39;');
Python
import html

# Encode (escape)
html.escape('<script>alert("xss")</script>')
# '&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;'

# Encode including single quotes
html.escape("it's", quote=True)
# 'it&#x27;s'

# Decode (unescape)
html.unescape('&lt;b&gt;Hello &amp; World&lt;/b&gt;')
# '<b>Hello & World</b>'
Go
import "html"

// Encode
html.EscapeString("<script>alert('xss')</script>")
// "&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;"

// Decode
html.UnescapeString("&lt;b&gt;Hello &amp; World&lt;/b&gt;")
// "<b>Hello & World</b>"

// In templates (auto-escaped)
import "html/template"
t := template.Must(template.New("").Parse(
    "<p>{{.}}</p>"))
t.Execute(os.Stdout, "<b>Hello</b>")
// <p>&lt;b&gt;Hello&lt;/b&gt;</p>
PHP / Twig
<?php
// Encode
htmlspecialchars('<b>Hello</b> & "World"', ENT_QUOTES, 'UTF-8');
// '&lt;b&gt;Hello&lt;/b&gt; &amp; &quot;World&quot;'

// Decode
htmlspecialchars_decode('&lt;b&gt;Hello&lt;/b&gt;');
// '<b>Hello</b>'

// All HTML entities (including named ones)
htmlentities('© 2025 — Café', ENT_QUOTES, 'UTF-8');
// '&copy; 2025 &mdash; Caf&eacute;'

// Twig (auto-escaped by default)
// {{ user_input }}        ← auto-escaped
// {{ user_input|raw }}    ← raw HTML (unsafe!)

Часто задаваемые вопросы

Зачем нужно кодирование HTML-сущностей?
Некоторые символы имеют особое значение в HTML: < и > для тегов, & для сущностей, " для значений атрибутов. Вставка необработанного пользовательского ввода в HTML позволяет браузеру интерпретировать их как HTML-структуру, создавая уязвимости XSS (межсайтовый скриптинг). Экранирование в &lt;, &gt;, &amp;, &quot; заставляет браузер отображать их как текст, а не выполнять код.
В чём разница между именованными и числовыми HTML-сущностями?
Именованные сущности используют запоминающиеся имена: &amp; (&), &copy; (©), &nbsp; (неразрывный пробел). Числовые сущности используют кодовую точку Unicode: десятичная &#169; или шестнадцатеричная &#xA9; (обе означают ©). Именованные сущности существуют только для символов, определённых в спецификации HTML; числовые сущности могут представлять любой символ Unicode.
Какие 5 символов наиболее важны для HTML-кодирования?
Основные 5: & → &amp; (должен кодироваться первым, иначе сломает другие сущности), < → &lt;, > → &gt;, " → &quot; (внутри значений атрибутов), ' → &#39; или &apos; (внутри значений атрибутов). Остальные символы (CJK, ©, € и т.д.) не требуют кодирования — современные браузеры полностью поддерживают UTF-8.
Что такое &nbsp; и когда его использовать?
&nbsp; — это неразрывный пробел (U+00A0). В отличие от обычных пробелов: 1) Браузер не переносит строку на &nbsp;. 2) Несколько &nbsp; не сжимаются в один (HTML обычно сжимает последовательные пробелы). Используйте для фиксированных интервалов — например, между числом и единицей измерения '100&nbsp;km' или чтобы предотвратить разрыв фразы между строками.
React и Vue автоматически кодируют HTML-содержимое?
Да. React JSX и шаблоны Vue экранируют все интерполированные значения по умолчанию. В React <div>{userInput}</div> автоматически кодирует специальные символы — только dangerouslySetInnerHTML обходит это (используйте с крайней осторожностью). В Vue {{ userInput }} автоматически экранируется; только директива v-html вставляет необработанный HTML.
В чём разница между HTML-кодированием и URL-кодированием?
HTML-кодирование сущностей (&amp;, &lt; и т.д.) экранирует специальные символы в контексте HTML-документа для предотвращения неоднозначности парсинга HTML. URL-кодирование (%26, %3C и т.д.) экранирует не-ASCII и зарезервированные символы в контексте URL/URI. Они служат разным целям. Для атрибута href: сначала URL-кодируйте значение, затем HTML-кодируйте весь атрибут.