Как приручить кодировки в PHP без боли и лишних расширений

19 июн 2026
577
51
4
1 месяц

Знакомая история: вы пишете код, который должен превращать пользовательский ввод в красивые URL-слаги или чистые имена файлов. И тут прилетает строка вроде «Düsseldorf» или что-то на кириллице. Вы лезете в документацию mbstring или iconv, проверяете, установлены ли они на сервере клиента, и начинаете городить огород из проверок. А если расширений нет? Проект падает, клиент недоволен.

Недавно наткнулся на небольшую, но крайне полезную библиотеку portable-ascii от разработчика voku. Она решает вечную проблему транслитерации и очистки строк, причем делает это максимально деликатно.

Build Status Build status codecov.io

Что это такое и зачем оно в вашем проекте

По сути, это набор статических методов для работы с 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 внутри.

Когда стоит использовать

Я бы советовал держать этот пакет под рукой в трех случаях:

  1. Вы разрабатываете продукт, который будет распространяться и устанавливаться на разные сервера с непредсказуемым окружением.
  2. Вам нужна быстрая и легкая транслитерация без настройки локалей в системе.
  3. Нужно чистить строки от невидимых символов и битых UTF-8 последовательностей (метод clean отлично с этим справляется).

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

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.