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_encoding a mbstring.http_input níž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)
  2. Shrnutí

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).

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í.

php.ini


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.

php.ini


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.