Kaip sutvarkyti iškraipytą PHP formos įvestį: UTF-8 ir mbstring


Paskelbimo data:

Atnaujinta:


Techniniai straipsniai > Kaip sutvarkyti iškraipytą PHP formos įvestį: UTF-8 ir mbstring

2026 m. būsena ir saugus naudojimas

Trumpai: HTML formoje, HTTP atsakyme, PHP išeities kode, eilučių apdorojime ir duomenų bazės ryšyje aiškiai naudokite vieną koduotę – paprastai UTF-8. Prieš keisdami bendrąsias nuostatas užfiksuokite neapdorotą įvestį ir nustatykite ribą, kurioje baitai dekoduojami neteisingai.

Ką išmoksite

  • Kaip atskirti rodymo problemą nuo įvesties konvertavimo ar duomenų bazės sugadinimo.
  • Kokios antraštės ir PHP nustatymai yra svarbūs šiuolaikinėms UTF-8 programoms.
  • Kodėl toliau pateikti pasenę mbstring.internal_encoding ir mbstring.http_input receptai neturėtų būti kopijuojami į dabartinį diegimą.

Kam skirtas straipsnis: PHP prižiūrėtojams, šalinantiems iškraipyto teksto problemą po formos patvirtinimo, peradresavimo ar įrašymo į duomenų bazę ir nuskaitymo iš jos.

2026 m. kontekstas: senos iconv ir mbstring koduotės direktyvos buvo pažymėtos kaip nebenaudojamos PHP 5.6, o vėliau pašalintos; pasikeitė ir default_charset elgesys. Dabartiniame kode koduotę aiškiai nurodykite ties kiekviena duomenų riba. Pradinė konfigūracija čia palikta tik istorinei problemai paaiškinti.

Saugos pastaba: pradinio straipsnio komandos ir konfigūracijos pavyzdžiai nebuvo iš naujo išbandyti dabartinėje produkcinėje aplinkoje. Prieš juos taikydami atskiroje bandymo aplinkoje patikrinkite palaikomas versijas, atsargines kopijas, prieigos kontrolę ir grįžimo prie ankstesnės būsenos veiksmus.

Pagrindiniai oficialūs šaltiniai

Apžvalga

Pradiniame incidente PHP programoje į formą įvestas tekstas išsikraipydavo pereinant į patvirtinimo ekraną. Ta pati problema pasireikšdavo po įvesties tikrinimo klaidos ir pakartotinio formos parodymo.

Kadangi tai buvo naujai parengtas serveris, tyrimas pradėtas nuo PHP koduotės nuostatų. Toliau pateikta istorinė diagnostikos eiga; senųjų direktyvų nekopijuokite į dabartinę PHP versiją.


Turinys

  1. Priežasties nustatymas
  2. Išvada

1. Priežasties nustatymas

Koduotę reikia sekti per visą duomenų kelią: HTTP užklausą, PHP eilučių apdorojimą, šabloną, atsakymo antraštes ir duomenų bazės ryšį.

1-1. Koduotės nuostatų patikra

Pradiniame tyrime pirmiausia patikrintas php.ini.

php.ini


default_charset = "UTF-8"
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On

Šios nuostatos atrodė tinkamos, o patikrinus PHP išeities kodą aiškios problemos nerasta. Pakartotinai peržiūrint php.ini dėmesį patraukė senoji mbstring.http_input reikšmė.

php.ini


mbstring.http_input = auto

Kadangi reikšmė auto neleido iš karto patvirtinti pasirinktos koduotės, istoriniame bandyme ji buvo laikinai pakeista į UTF-8.

php.ini


mbstring.http_input = UTF-8

Toje senoje aplinkoje pakeitimas pašalino iškraipytą tekstą ir parodė, kad klaida atsirado dekoduojant HTTP įvestį.

Tai nėra dabartinės PHP konfigūracijos receptas. Šiuolaikinėje programoje patikrinkite faktinę užklausos koduotę, Content-Type antraštes, default_charset, duomenų bazės ryšį ir vietą, kurioje tekstas pirmą kartą tampa neteisingas.

2. Išvada

Susidūrę su iškraipytu tekstu, pirmiausia nubraižykite duomenų kelią ir nustatykite pirmą ribą, kurioje baitai interpretuojami neteisingai. Vien pakeisti bendrą php.ini nuostatą nepakanka.

Senos mbstring.internal_encoding ir mbstring.http_input direktyvos skirtos tik istoriniam incidentui paaiškinti. Dabartinėje PHP versijoje koduotę aiškiai derinkite HTTP, programos ir duomenų bazės lygmenyse.