Felsök teckenkodningsfel i PHP-formulär med UTF-8 och mbstring
Publicerad:
Uppdaterad:
Tekniska artiklar > Felsök teckenkodningsfel i PHP-formulär med UTF-8 och mbstring
Status 2026 och säker användning
Slutsats: Använd en uttrycklig teckenkodning, normalt UTF-8, genom hela kedjan från HTML-formulär och HTTP-svar till PHP, stränghantering och databasanslutning. Granska rådata och hitta gränsen där byteföljden tolkas fel innan globala inställningar ändras.
Det här går artikeln igenom
- Hur ett rent visningsfel skiljs från felaktig indatakonvertering eller skadade databasvärden.
- Vilka HTTP-rubriker och PHP-inställningar som är relevanta för moderna UTF-8-program.
- Varför de gamla inställningarna
mbstring.internal_encodingochmbstring.http_inputnedan inte ska kopieras till en aktuell PHP-miljö.
Målgrupp: PHP-utvecklare som felsöker teckenkodningsfel efter formulärvalidering, omdirigeringar eller databasåtkomst.
Läge 2026: PHP markerade de gamla kodningsdirektiven för iconv och mbstring som föråldrade i PHP 5.6 till förmån för default_charset. Modern kod bör ange kodningen uttryckligen vid varje gräns. Originalkonfigurationen behålls bara som dokumentation av det historiska fallet.
Säkerhetsinformation: Kommandona och konfigurationsexemplen i originalartikeln har inte testats på nytt i en aktuell produktionsmiljö. Kontrollera versioner med support, säkerhetskopior, åtkomstkontroller och återställningssteg i en separat testmiljö innan de används.
Viktiga officiella källor
Översikt
I det undersökta PHP-systemet blev formulärtexten felkodad.
Felet visade sig när användaren gick från inmatningssidan till bekräftelsesidan.
Samma fel uppstod när en validering misslyckades och formuläret visades på nytt.
Eftersom servern var nyinstallerad riktades felsökningen först mot PHP-konfigurationen.
Innehållsförteckning
1. Orsaksanalys
Följande inställningar granskades för att hitta var teckenkodningen blev fel.
1-1. Granska PHP-konfigurationen
Kontrollera först inställningarna i php.ini.
default_charset = "UTF-8"
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On
De första värdena såg korrekta ut.
Därför granskades PHP-källkoden.
Inget tydligt fel hittades där.
Vid en andra genomgång av php.ini upptäcktes däremot en inställning som kunde påverka indatans teckenkodning.
mbstring.http_input = auto
Värdet "auto" gjorde det oklart om indatan tolkades som UTF-8. I den gamla testmiljön ändrades inställningen därför enligt nedan.
mbstring.http_input = UTF-8
I den miljön försvann teckenkodningsfelet efter ändringen.
Inställningen styrde hur den gamla mbstring-modulen tolkade multibyte-text, till exempel japanska tecken, i inkommande HTTP-förfrågningar.
Den ska inte kopieras oförändrad till modern PHP.
2. Sammanfattning
Vid teckenkodningsfel bör hela dataflödet kartläggas och värdet kontrolleras före och efter varje gräns.
I det historiska fallet låg felet i mbstrings automatiska tolkning av HTTP-indata. I modern PHP ska HTML, HTTP-rubriker, PHP och databasanslutning i stället konfigureras konsekvent för UTF-8.
Kontrollera dokumentationen för den installerade PHP-versionen innan någon global kodningsinställning ändras.
Verifiera resultatet med representativa byteföljder vid varje gräns i dataflödet.