Как приручить кодировки в PHP без боли и лишних расширений
Знакомая история: вы пишете код, который должен превращать пользовательский ввод в красивые URL-слаги или чистые имена файлов. И тут прилетает строка вроде «Düsseldorf» или что-то на кириллице. Вы лезете в документацию mbstring или iconv, проверяете, установлены ли они на сервере клиента, и начинаете городить огород из проверок. А если расширений нет? Проект падает, клиент недоволен.
Недавно наткнулся на небольшую, но крайне полезную библиотеку portable-ascii от разработчика voku. Она решает вечную проблему транслитерации и очистки строк, причем делает это максимально деликатно.
Что это такое и зачем оно в вашем проекте
По сути, это набор статических методов для работы с ASCII-символами. Главная фишка заложена в названии — портативность. Библиотека написана на чистом PHP 7+ и не требует наличия mbstring, iconv или других специфических расширений. Она опирается только на библиотеку PCRE, которая встроена в PHP по умолчанию уже лет двадцать.
Это идеальный инструмент для тех, кто пишет плагины, пакеты или CMS, которые должны завестись на любом «утюге» — от дешевого шаред-хостинга до навороченного Docker-контейнера.
Что умеет библиотека
Автор собрал под капотом опыт нескольких известных проектов (вроде Stringy и URLify) и кучу проверенных решений со Stack Overflow. Вот несколько функций, которые я использую чаще всего.
Умная транслитерация с учетом языка
Самая частая задача — превратить спецсимволы в понятные латинские буквы. Метод to_ascii понимает контекст. Например, немецкая «ü» в Германии превратится в «ue», а в английской локали — просто в «u».
use voku\helper\ASCII;
// Выведет: Duesseldorf
echo ASCII::to_ascii('Düsseldorf', 'de');
// Выведет: Dusseldorf
echo ASCII::to_ascii('Düsseldorf', 'en');
Создание безопасных имен файлов и слагов
Если вам нужно сохранить файл, загруженный пользователем, или создать ЧПУ для статьи, пригодятся методы to_filename и to_slugify. Они не просто вырезают «плохие» символы, а стараются сохранить читаемость текста.
// Вернет: shdgshdg.png
ASCII::to_filename('שדגשדг.png', true);
Очистка «мусора» из MS Word
Все мы знаем, как менеджеры любят копировать текст из Word прямо в админку. Вместе с текстом прилетают «умные» кавычки, специфические тире и многоточия, которые ломают верстку или базу данных. Метод normalize_msword заменяет всю эту «красоту» на стандартные ASCII-аналоги.
// Превратит „Abcdef…” в "Abcdef..."
ASCII::to_ascii(ASCII::normalize_msword('„Abcdef…”'));
Технические нюансы
Библиотека весит немного и не тянет за собой ворох зависимостей. Это чистый код, который легко закинуть в проект через Composer:
composer require voku/portable-ascii
Минимальные требования — PHP 7.1, но автор уже добавил поддержку вплоть до PHP 8.5. Внутри используется огромный массив сопоставлений символов для десятков языков, включая русский. Если вам интересно, как именно буква «б» превращается в «b», загляните в метод charsArray(). Там лежат гигантские таблицы замен, которые собирались годами.
Кстати, если вы предпочитаете объектно-ориентированный стиль вместо статических вызовов, у автора есть форк библиотеки Stringy, который использует portable-ascii внутри.
Когда стоит использовать
Я бы советовал держать этот пакет под рукой в трех случаях:
- Вы разрабатываете продукт, который будет распространяться и устанавливаться на разные сервера с непредсказуемым окружением.
- Вам нужна быстрая и легкая транслитерация без настройки локалей в системе.
- Нужно чистить строки от невидимых символов и битых UTF-8 последовательностей (метод
cleanотлично с этим справляется).
Проект живой, активно поддерживается и имеет хорошую базу тестов. Это тот случай, когда маленькая утилита закрывает огромный пласт мелких, но раздражающих проблем с кодировками раз и навсегда.
