Обработка строковых кодировок в PHP

Раздел: Разработка на PHP -> Работа со строками

Кодирование строк в PHP: основные подходы

Основное эффективное решение: mb_convert_encoding

Функция mb_convert_encoding из расширения mbstring является наиболее универсальным инструментом для перекодировки строк. Она поддерживает множество кодировок и корректно обрабатывает многобайтовые символы (кириллица, иероглифы). Пример преобразования UTF-8 в Windows-1251:

$str = 'Привет, мир!';
$encoded = mb_convert_encoding($str, 'Windows-1251', 'UTF-8');
echo $encoded;

Результат - строка в кодировке Windows-1251. Первый аргумент - исходная строка, второй - целевая кодировка, третий - исходная кодировка (можно передать массив для автоопределения).

Типичные проблемы:

  • Расширение mbstring не установлено - вызов функции завершится ошибкой. Решение: установить модуль mbstring (например, apt install php-mbstring).
  • Неправильное указание исходной кодировки приводит к появлению кракозябр. Всегда проверяйте реальную кодировку входных данных.

Как перекодировать строку с помощью функции iconv?

iconv - встроенная функция, доступная без дополнительных расширений. Поддерживает меньше кодировок, чем mbstring, но для большинства задач подходит. Пример UTF-8 → CP1251:

$str = 'Привет';
$encoded = iconv('UTF-8', 'CP1251//IGNORE', $str);
echo $encoded;

Опция //IGNORE игнорирует символы, которые нельзя преобразовать. Вместо неё можно использовать //TRANSLIT для транслитерации.

Ошибки:

  • Если указана неподдерживаемая кодировка, возвращается false и генерируется предупреждение. Проверяйте результат.
  • Без флагов iconv может оборвать строку при встрече недопустимого символа.

Как закодировать строку для передачи в URL?

Для URL применяются urlencode (кодирует пробел как +) и rawurlencode (кодирует пробел как %20). Рекомендуется rawurlencode для соответствия RFC 3986.

$query = 'ключ=значение & текст';
$encoded = rawurlencode($query);
echo $encoded;
%D0%BA%D0%BB%D1%8E%D1%87%3D%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%26%20%D1%82%D0%B5%D0%BA%D1%81%D1%82

Декодирование выполняется функцией urldecode или rawurldecode.

Проблема:

  • Путаница между urlencode и rawurlencode: первый не подходит для query-параметров в современном REST, второй - универсален.

Какие функции нужны для кодирования HTML-сущностей?

htmlspecialchars преобразует специальные символы (<, >, &, ", '). htmlentities преобразует все символы, имеющие именованные сущности (например, ©).

$html = '<b>тест & "кавычки"</b>';
echo htmlspecialchars($html, ENT_QUOTES | ENT_HTML5, 'UTF-8');
&lt;b&gt;тест &amp; &quot;кавычки&quot;&lt;/b&gt;

Второй параметр - флаги обработки кавычек и версия HTML, третий - кодировка.

Типичная ошибка:

  • Не указанная кодировка (по умолчанию ISO-8859-1) приводит к искажению кириллицы. Всегда явно задавайте 'UTF-8'.

Как кодировать строки в формат Base64?

Base64 используется для передачи бинарных данных в текстовом окружении (например, в JSON, email). Функции base64_encode и base64_decode.

$original = 'Привет, мир!';
$encoded = base64_encode($original);
echo $encoded;
0J/RgNC40LLQtdGCLCDQvNC40YAh

Декодирование:

$decoded = base64_decode($encoded);
echo $decoded;
Привет, мир!

Внимание:

  • Base64 не является шифрованием - это кодирование. Не используйте для защиты данных.
  • Результат занимает примерно на 33% больше места.

Как определить кодировку строки?

Функция mb_detect_encoding пытается угадать кодировку по списку возможных вариантов.

$str = 'тест';
$encoding = mb_detect_encoding($str, ['UTF-8', 'Windows-1251', 'KOI8-R'], true);
echo $encoding; // UTF-8

Третий параметр - строгий режим (true). Без него функция может вернуть ложный результат.

Ограничение:

  • mb_detect_encoding не гарантирует 100% точности, особенно для коротких строк.

Расширенные примеры кодирования строк в PHP

Пример 1. Перекодировка массива строк с определением исходной кодировки

Пример
$strings = ['Привет', 'Hello', 'Здравствуйте'];
$targetEncoding = 'UTF-8';
$converted = [];
foreach ($strings as $str) {
    $detected = mb_detect_encoding($str, ['UTF-8', 'Windows-1251', 'KOI8-R'], true);
    if ($detected !== $targetEncoding) {
        $converted[] = mb_convert_encoding($str, $targetEncoding, $detected);
    } else {
        $converted[] = $str;
    }
}
print_r($converted);
Array
(
    [0] => Привет
    [1] => Hello
    [2] => Здравствуйте
)

Пример 2. Кодирование бинарного файла в Base64 для передачи в JSON

Пример
$imageData = file_get_contents('/path/to/image.png');
$base64 = base64_encode($imageData);
$jsonPayload = json_encode(['image' => $base64]);
echo $jsonPayload;
{"image":"iVBORw0KGgoAAAANSUhEUgAA..."}

Пример 3. Безопасное кодирование пользовательского ввода для вывода в HTML

Пример
$userInput = " & 'кавычки'";
$safeOutput = htmlspecialchars($userInput, ENT_QUOTES | ENT_HTML5, 'UTF-8');
echo $safeOutput;
<script>alert('XSS')</script> &amp; 'кавычки'

Пример 4. Транслитерация символов при конвертации кодировки с помощью iconv

Пример
$russian = 'Щука съела ерша';
$translit = iconv('UTF-8', 'ASCII//TRANSLIT', $russian);
echo $translit;
SHCHuka s"ela ersha

Пример 5. Декодирование URL-запроса и преобразование в нужную кодировку

Пример
$urlPart = '%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82';
$decoded = rawurldecode($urlPart);
// Если исходная кодировка UTF-8, то декодирование уже даёт кириллицу
echo $decoded;
Привет

Пример 6. Комбинирование кодирования: сначала Base64, потом URL

Пример
$data = 'Секретные данные';
$b64 = base64_encode($data);
$urlEncoded = rawurlencode($b64);
echo $urlEncoded;
// Обратно:
$b64 = rawurldecode($urlEncoded);
$original = base64_decode($b64);
echo $original;
0KHQtdC60YDQtdGC0L3Ri9C1INC00LDQvdC90YvQtQ%3D%3D
Секретные данные

Кодирование строк в PHP (encode) - comments

En
Php encode (php)