Mb encode numericentity: примеры (PHP)

Функция mb_encode_numericentity для преобразования символов
Раздел: Многобайтовые строки
mb_encode_numericentity(string $string, array $map, ?string $encoding = null, bool $hex = false): string

Функция mb_encode_numericentity

Функция mb_encode_numericentity преобразует символы строки в HTML-числовые сущности. Она относится к модулю Multibyte String (mbstring) и предназначена для обработки многобайтовых кодировок.

Когда используется

Функция применяется для безопасного вывода текста в HTML-документах, особенно когда необходимо закодировать символы, не входящие в выбранную кодировку страницы. Она предотвращает проблемы с отображением и снижает риски XSS-атак, преобразуя спецсимволы и символы из нестандартных диапазонов.

Аргументы функции

string $string: Обрабатываемая строка.
array $map: Массив, задающий диапазоны кодирования символов. Каждый элемент массива - массив из двух целых чисел (коды начального и конечного символов).
?string $encoding = null: Кодировка строки. Если null, используется внутренняя кодировка.
bool $hex = false: Если true, возвращает шестнадцатеричные числовые сущности (например, ჿ). По умолчанию - десятичные (ჿ).

Примеры использования

Кодирование кириллицы
<?php
$str = "Привет, мир!";
$map = [0x0410, 0x044F]; // Диапазон кириллицы в Unicode
$result = mb_encode_numericentity($str, [$map]);
echo htmlspecialchars($result);
?>
&#1055;&#1088;&#1080;&#1074;&#1077;&#1090;, &#1084;&#1080;&#1088;!
Шестнадцатеричный формат
<?php
$str = "Символ €";
$map = [0x80, 0x10FFFF]; // Широкий диапазон
$result = mb_encode_numericentity($str, [$map], 'UTF-8', true);
echo htmlspecialchars($result);
?>
Символ &#x20AC;

Альтернативные функции в PHP

htmlspecialchars(): Преобразует спецсимволы HTML (&, ", ', <, >) в сущности. Используется для базовой защиты от XSS.

htmlentities(): Преобразует все символы, имеющие HTML-сущности. Менее эффективна для многобайтовых строк.

mb_convert_encoding(): Конвертирует строку между кодировками, но не создает числовые сущности.

Функцию mb_encode_numericentity выбирают для точного контроля над диапазонами кодируемых символов и работы с многобайтовыми кодировками.

Типичные ошибки

Неправильный диапазон в map
<?php
$str = "Test";
$result = mb_encode_numericentity($str, [[0, 10]]); // Диапазон без указания кодировки
?>
// Символы вне диапазона не преобразуются
Использование неверной кодировки
<?php
$str = "Яндекс";
$result = mb_encode_numericentity($str, [[0x80, 0x10FFFF]], 'ASCII');
?>
// Может возникнуть искажение строки
Некорректный hex-флаг
<?php
$str = "A";
$result = mb_encode_numericentity($str, [[65, 65]], null, 'yes');
?>
// TypeError в PHP 8.0+

Изменения в версиях PHP

В PHP 8.0 параметры $encoding и $hex стали обязательными в определенных контекстах. Тип параметра $hex изменен на bool, неявные преобразования вызывают ошибку.

В PHP 7.4 добавлена возможность указывать $encoding как null для использования внутренней кодировки.

До PHP 5.4 функция имела проблемы с некоторыми многобайтовыми кодировками.

Расширенные примеры

Избирательное кодирование символов
Пример php
<?php
$str = "A©€????";
// Кодируем только смайлики (диапазон эмодзи)
$map = [0x1F300, 0x1F5FF];
$result = mb_encode_numericentity($str, [$map], 'UTF-8', true);
echo htmlspecialchars($result);
?>
A©€&#x1F418;
Множественные диапазоны
Пример php
<?php
$str = "中文 + English = Смесь";
$maps = [
    [0x4E00, 0x9FFF], // Китайские иероглифы
    [0x0400, 0x04FF]  // Кириллица
];
$result = mb_encode_numericentity($str, $maps);
echo htmlspecialchars($result);
?>
&#20013;&#25991; + English = &#1057;&#1084;&#1077;&#1089;&#1100;
Обработка HTML-сущностей
Пример php
<?php
$str = "<div>Привет</div>";
// Сначала экранируем HTML, затем кодируем кириллицу
$str = htmlspecialchars($str);
$result = mb_encode_numericentity($str, [[0x0410, 0x044F]]);
echo $result;
?>
&lt;div&gt;&#1055;&#1088;&#1080;&#1074;&#1077;&#1090;&lt;/div&gt;

Альтернативы в других языках

Python
import html
result = html.escape("Символ < €")
print(result)  # Простые сущности
# Для числовых сущностей:
print("".join(f"&#{ord(c)};" for c in "€"))
Символ &lt; €
&#8364;

Mb encode numericentity в Javascript

function encodeNumeric(str) {
    return str.replace(/[^\x00-\x7F]/g, c => `&#${c.charCodeAt(0)};`);
}
console.log(encodeNumeric("€"));
&#8364;

Mb encode numericentity в MySQL

SELECT HEX('€');  -- Возвращает шестнадцатеричное значение
E282AC

PHP mb_encode_numericentity function comments

En
Mb encode numericentity Encode character to HTML numeric string reference