Er kunnen hier zoveel dingen mis gaan, omdat database, formulierinzendingen en letterlijke broncodetekenreeksen er allemaal bij betrokken zijn. Ik neem aan dat je UTF-8 wilt gebruiken, want met elke andere typische codering (CP1252, Latin1) wordt je genaaid als je json_
wilt gebruiken of accepteer meer dan ~200 verschillende tekens.
Het eerste wat u moet doen is verwijderen elke vorm van conversie enz. code die is geschreven met de bedoeling om coderingsproblemen op te lossen. Zoals utf8_encode
, htmlentitites
, *_replace
.. wat dan ook.
Broncodering.
$str = "· Close up the server";
Bij het schrijven van het bovenstaande moet het PHP-bronbestand fysiek worden gecodeerd in UTF-8. Als u Windows gebruikt, moet u dit expliciet doen of configureren. UTF-8 gebeurt niet op magische wijze op Windows.
Formulier wordt verzonden
Wanneer de gebruiker een formulier indient, bevindt de payload zich in de codering die u voor de pagina hebt opgegeven. Je kunt het als volgt declareren:
header("Content-Type: text/html; charset=utf-8");
Maar iedereen kan willekeurige bytes naar uw server verzenden, dus u moet controleren of de invoer in UTF-8 is voordat u verder gaat. mb_check_encoding
is goed.
Database
Aangezien uw gegevens op dit moment binnenkomen als UTF-8, bevinden uw invoerreeksen zich in UTF-8. U moet dit specificeren nadat u verbinding heeft gemaakt met de database, door een verbindingscodering op te geven.
mysql_set_charset("utf8"); //After making the connection, and before any queries
//or $mysqli->set_charset( "utf8");
Hierdoor leest de database uw invoer in UTF-8 en codeert de uitvoer in UTF-8. Je zou ook je kolommen/tabellen/databases op UTF-8 willen zetten.
Unicode-escape-reeksen \uxxxx
of \uhhhh\ullll
of \Uxxxxxxxx
worden niet ondersteund in PHP.