PHP 8.4: MBString: База данных символов Юникода обновлена до версии 16
В 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 вызовет проблемы, можно считать редкой.