Odpravljanje popačenih znakov v obrazcu PHP: UTF-8 in mbstring


Datum objave:

Posodobljeno:


Tehnični članki > Odpravljanje popačenih znakov v obrazcu PHP: UTF-8 in mbstring

Stanje in varna uporaba v letu 2026

Bistvo: V obrazcu HTML, odgovoru HTTP, izvorni kodi PHP, obdelavi nizov in povezavi z zbirko podatkov uporabljajte izrecno določeno kodiranje, običajno UTF-8. Pred spreminjanjem globalnih nastavitev zajemite neobdelani vnos in poiščite mejo, na kateri se bajti napačno dekodirajo.

Kaj boste izvedeli

  • Kako težavo s prikazom razlikovati od napačne pretvorbe vhoda ali okvare podatkov v zbirki.
  • Katere glave HTTP in nastavitve PHP so pomembne za sodobne aplikacije UTF-8.
  • Zakaj starih direktiv mbstring.internal_encoding in mbstring.http_input iz spodnjega primera ne smemo prenesti v sodobno konfiguracijo.

Komu je članek namenjen? Vzdrževalcem PHP, ki odpravljajo popačene znake po oddaji obrazca, preusmeritvi ali zapisu in branju iz zbirke podatkov.

Opomba za leto 2026: PHP je stare direktive iconv in mbstring za kodiranje opustil že v PHP 5.6 v korist default_charset. Sodobna koda mora kodiranje jasno določiti na vsaki meji; prvotna konfiguracija je ohranjena le kot razlaga zgodovinskega primera.

Varnostna opomba: Ukazi in konfiguracijski primeri iz prvotnega članka niso bili znova preizkušeni v sodobnem produkcijskem okolju. Pred uporabo v ločenem preizkusnem okolju preverite podprte različice, izdelajte varnostne kopije ter določite nadzor dostopa in postopek povrnitve.

Uradni viri

Pregled

V zgodovinskem primeru so se ob prehodu iz obrazca PHP na potrditveni zaslon pojavili popačeni znaki.

Besedilo se je popačilo po vnosu v obrazec in oddaji na naslednji zaslon.

Enaka težava se je pojavila tudi ob vrnitvi na obrazec po napaki pri preverjanju vnosa.

Ker je bil strežnik pravkar postavljen, je preiskava najprej zajela konfiguracijo PHP.


Kazalo vsebine

  1. Iskanje vzroka
  2. Povzetek

1. Iskanje vzroka

Pri iskanju vzroka težave so bile preverjene naslednje informacije.

1-1. Preverjanje konfiguracije

Najprej preverite nastavitve PHP (php.ini).

php.ini


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

Prikazane nastavitve na prvi pogled niso kazale napake.

Naslednji korak je bil pregled izvorne kode PHP.

Tudi v njej ni bilo očitnega vzroka.

Ponovni pregled datoteke php.ini pa je razkril sumljivo nastavitev.

php.ini


mbstring.http_input = auto

Ker vrednost "auto" ni zagotavljala, da bo vhod obravnavan kot UTF-8, je bila nastavitev za preizkus izrecno spremenjena.

php.ini


mbstring.http_input = UTF-8

V tem starem okolju je sprememba odpravila popačene znake.

Nastavitev je modulu mbstring določila kodiranje večbajtnega vhoda, na primer japonskega besedila.

Gre za zgodovinsko nastavitev kodiranja prejetih zahtev HTTP.

2. Povzetek

Ob popačenih znakih najprej popišite celoten tok podatkov in kodiranje na vsaki meji.

V tem zgodovinskem primeru je bila težava povezana z direktivo mbstring.http_input v datoteki php.ini.

V zgodovinskem okolju je bila nastavljena vrednost "auto"; v sodobnem PHP namesto kopiranja te rešitve uporabljajte izrecno kodiranje UTF-8 in aktualne direktive.

Pri uporabi v novejšem okolju upoštevajte tudi opombe o različicah in varnosti na začetku članka.