Oprava poškozeného vstupu formuláře v PHP: UTF-8 a mbstring
Publikováno:
Aktualizováno:
Články › Oprava poškozeného vstupu formuláře v PHP: UTF-8 a mbstring
Stav v roce 2026 a bezpečné použití
Závěr: Zachovejte jedno explicitní kódování – obvykle UTF-8 – ve formuláři HTML, odpovědi HTTP, zdroji PHP, zpracování řetězců a připojení k databázi. Před změnou globálního nastavení zachyťte nezpracovaný vstup a identifikujte hranici, kde jsou bajty dekódovány nesprávně.
Co se dozvíte
- Jak odlišit problém se zobrazením od převodu vstupu nebo poškození databáze.
- Která záhlaví a nastavení PHP jsou relevantní pro moderní aplikace UTF-8.
- Proč by se starší recept
mbstring.internal_encodingambstring.http_inputníže neměl zkopírovat do aktuálního nasazení.
Pro koho je článek určen: Správci PHP při odstraňování problémů s mojibake po ověření formuláře, přesměrování nebo okružní jízdě databáze.
Aktuální stav v roce 2026: PHP zavrhlo staré direktivy kódování iconv/mbstring v PHP 5.6 ve prospěch default_charset; moderní kód by měl dělat kódování explicitní na každé hranici. Původní konfigurace je zachována pouze pro vysvětlení historické události.
Bezpečnostní poznámka: Příkazy a konfigurační příklady z původního článku nebyly znovu spuštěny v současném produkčním prostředí. Před nasazením ověřte podporované verze, vytvořte zálohu a připravte postup návratu v odděleném testovacím prostředí.
Oficiální zdroje
Přehled
Při přechodu ze vstupní obrazovky na potvrzovací obrazovku v jazyce PHP docházelo ke zkreslenému textu.
Při zadávání textu do formuláře a přechodu na potvrzovací obrazovku dochází ke zkreslení textu.
Ke zkreslenému textu dochází také při přechodu na vlastní obrazovku v důsledku chyb kontroly vstupu.
Protože byl server právě postaven, měl jsem pocit, že v konfiguraci PHP něco chybí, a tak popíšu, co jsem tehdy zjistil.
Obsah
1. vyšetřování (zjišťování příčiny něčeho)
Při zkoumání příčiny problému byly prověřeny následující informace.
1-1. průzkum
Nejprve zkontrolujte nastavení PHP (php.ini).
default_charset = "UTF-8"
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On
Je to tak, jak je popsáno výše, a zdá se, že je v pořádku.
Pak se zdá, že problém je způsoben zdrojem PHP.
Zdroj PHP však pravděpodobný problém neidentifikoval.
Opět jsem zkontroloval php.ini na podezřelá nastavení a našel jsem jedno podezřelé nastavení.
mbstring.http_input = auto
Nebylo jasné, zda je kódován v UTF-8, protože byl nastaven na automatický, takže byl změněn takto, aby se to vyzkoušelo.
mbstring.http_input = UTF-8
Úspěšně vyřešeno zkomolení textu.
Toto nastavení je nezbytné pro modul mbstring při používání vícebajtových řetězců, například japonštiny v PHP.
Konfigurace kódování přijatých požadavků http.
2. shrnutí
Pokud se objeví zkreslený text, pokuste se nejprve uspořádat tok zpracování.
Pokud se při přechodu ze vstupní obrazovky na potvrzovací obrazovku nebo při jiných přechodech mezi obrazovkami objevují zkomolené znaky, podezřívejte následující nastavení v souboru php.ini.
Výchozí nastavení je 'auto', proto jej při použití mbstring ke zpracování vícebajtových řetězců zkontrolujte.
Tím jsou shrnuty hlavní kroky a omezení, která je třeba zohlednit.