Исправление искаженного ввода формы в PHP: UTF-8 и mbstring
Дата публикации:
Обновлено:
Статьи > Исправление искаженного ввода формы в PHP: UTF-8 и mbstring
Статус 2026 и безопасное использование
Вывод: Сохраняйте одну явную кодировку — обычно UTF-8 — для формы HTML, ответа HTTP, источника PHP, обработки строк и подключения к базе данных. Прежде чем менять глобальные настройки, запишите необработанные входные данные и определите границу, где байты декодируются неправильно.
Чему вы научитесь
- Как отличить проблему отображения от преобразования входных данных или повреждения базы данных.
- Какие заголовки и настройки PHP актуальны для современных приложений UTF-8.
- Почему устаревшие рецепты
mbstring.internal_encodingиmbstring.http_input, приведенные ниже, не следует копировать в текущее развертывание.
Для кого: специалисты по сопровождению PHP, устраняющие неполадки mojibake после проверки формы, перенаправления или обращения к базе данных.
Актуальность на 2026 год: PHP отказался от старых директив кодирования iconv/mbstring в PHP 5.6 в пользу default_charset; современный код должен сделать кодирование явным на каждой границе. Исходная конфигурация сохранена только для объяснения исторического происшествия.
Примечание по безопасности. Команды и примеры конфигурации из исходной статьи не проверялись повторно в современной производственной среде. Перед применением проверьте поддерживаемые версии, резервные копии, контроль доступа и процедуру отката в отдельной тестовой среде.
Официальные первоисточники
Обзор
При переходе от экрана ввода к экрану подтверждения в PHP возникал мусорный текст.
При вводе текста в форму и переходе к экрану подтверждения текст искажается.
При переходе к собственному экрану из-за ошибок проверки ввода также появляется искаженный текст.
Поскольку сервер был только что собран, я почувствовал, что чего-то не хватает в конфигурации PHP, поэтому я опишу, что я обнаружил в тот момент.
Оглавление
1. расследование (для определения причины чего-либо)
Для выяснения причины проблемы была изучена следующая информация.
1-1. опрос
Во-первых, проверьте настройки PHP (php.ini).
default_charset = "UTF-8"
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On
Он соответствует описанию выше и, похоже, в полном порядке.
Тогда проблема, похоже, вызвана источником PHP.
Однако источник PHP не определил вероятную проблему.
Я еще раз проверил php.ini на подозрительные настройки и нашел одну подозрительную настройку.
mbstring.http_input = auto
Было неясно, кодируется ли он в UTF-8, поскольку было установлено значение auto, поэтому для проверки он был изменен следующим образом.
mbstring.http_input = UTF-8
Успешное устранение искаженного текста.
Эта настройка необходима для модуля mbstring при использовании в PHP многобайтовых строк, таких как японский язык.
Настройка кодировки получаемых http-запросов.
2. резюме
Если возникает искаженный текст, сначала попробуйте организовать поток обработки.
Если при использовании PHP для перехода от экрана ввода к экрану подтверждения или других переходов между экранами у вас появляются искаженные символы, проверьте следующие настройки в php.ini.
По умолчанию установлено значение 'auto', поэтому проверьте его при использовании mbstring для обработки многобайтовых строк.