Обработка строковых кодировок в 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');
<b>тест & "кавычки"</b>
Второй параметр - флаги обработки кавычек и версия 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> & 'кавычки'
Пример 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 Секретные данные