PHP 8.4: MBString: База данных символов Юникода обновлена до версии 16

Источник: «PHP 8.4: MBString: Unicode Character Database updated to version 16»
Благодаря поддержке Unicode 16 расширение MBString может работать со всеми новейшими символами Emoji, а также имеет самую актуальную информацию о смене регистра и ширине символов.
Расширение MBString содержит подмножество данных из спецификации Unicode, используемое для таких операций, как преобразование заданной строки в верхний или нижний регистр, определение ширины строки (удобно для некоторых восточноазиатских шрифтов) и т.д.

В PHP 8.3 расширение MBString включало данные стандарта Unicode 14.0, выпущенного в сентябре 2022 года. В PHP 8.4 источник данных Unicode Character Database (UCD) был обновлён с 14.0 до 16.0, выпущенного в 2024 сентябре. Unicode 16.0 — это последняя версия UCD, доступная на этот момент.

В версии Unicode 15.0, 15.1 и 16.0 добавлено 4 489, 627 и 5 185 новых символов. Кроме того, три версии Unicode вместе взятые поддерживают 11 дополнительных скриптов. Однако для расширения MBString важны обновления в правилах сложения регистра символов, влияющие на такие функции, как mb_strtolower, mb_strtoupper и назначение значения восточноазиатской ширины, определяющее, считается ли данный символ нормальной ширины или широким (mb_strwidth).

Прямых изменений в функциях MBString нет. Данные символов Юникода являются частью самого расширения MBString и будут использоваться во всех функциях PHP 8.4.

Влияние на обратную совместимость

UCD 16 — последняя версия стандарта Unicode, и поскольку в параметрах и возвращаемых значениях функций нет никаких изменений, это вряд ли вызовет проблемы с обратной совместимостью.

Однако обратите внимание, что существует небольшая вероятность того, что данные, преобразования регистров или измерения ширины на старой версии PHP, вернут другой результат в PHP 8.4 и более поздних версиях.

Среди примеров можно отметить следующие:

echo "Emoji: \u{1F6DC}, width: " . mb_strwidth("\u{1F6DC}");
// Emoji: 🛜, width: 2

Эмодзи WiFi (🛜) добавлен в UCD 15, и старые версии PHP не определяют кодовую точку 1F6DC, возвращая вместо неё width: 1.

echo mb_strtoupper("\u{019b}") === "\u{a7dc}";

В UCD 16 появилось новое отображение регистра для символа 019b (ƛ — латинская строчная буква лямбда с чёрточкой). PHP 8.3 и более ранние версии не поддерживают это отображение регистра, поэтому mb_strtoupper("\u{019b}") возвращает само "\u{019b}". В PHP 8.4 и более поздних версиях с UCD 16, mb_strtoupper("\u{019b}") возвращает "\u{a7dc}".

Соответствие другой функциональности

Расширение Intl и расширения PCRE также используют Unicode Character Database в своих операциях.

В PHP 8.4 библиотека PCRE2 обновлена до версии 10.44. PCRE2 собрана с использованием UCD 15.

Расширение Intl полагается на библиотеку ICU для таблиц данных Юникода. В сборке по умолчанию UCD-версия базовой библиотеки ICU, скорее всего, будет UCD 15.

Хотя это и маловероятно, но могут быть крайние случаи, когда расширения MBString, Intl и PCRE по-разному обрабатывают символы. Например, новое отображение верхнего регистра в Unicode 16 для символа "\u{019b}" не распознается расширением PCRE как верхний регистр:

Обратите внимание, что несоответствие номера версии UCD не ново в PHP 8.4, и вероятность того, что несоответствие UCD вызовет проблемы, можно считать редкой.


Комментарии


Дополнительные материалы

Предыдущая Статья

BCMath: Новая функция bcdivmod

Следующая Статья

Сокращения JavaScript экономящие время