Kortom, omdat dit al duizend keer eerder is besproken:
- PHP bevat een string, zeg
"漢字"
, gecodeerd in UTF-8. De bytes hiervoor zijnE6 BC A2 E5 AD 97
. - Het verzendt deze string via een databaseverbinding die is ingesteld op
latin1
. - De database ontvangt de bytes
E6 BC A2 E5 AD 97
, denkend dat dielatin1
vertegenwoordigen tekens. - De database slaat de karakters op
æ¼¢å
(de tekens dieE6 BC A2 E5 AD 97
verwijst naar inlatin1
). - Het omgekeerde proces zorgt ervoor dat PHP dezelfde bytes ontvangt, die het vervolgens behandelt als UTF-8. De roundtrip werkt prima voor PHP, ook al behandelt de database de karakters niet zoals het hoort.
Het probleem hier was dus dat de databaseverbinding verkeerd was ingesteld toen de gegevens in de database werden ingevoerd. U moet de gegevens in de database omzetten naar de juiste tekens. Probeer dit:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Misschien utf8
is niet wat je hier nodig hebt, experimenteer. Als dat werkt, verander dit dan in een UPDATE
verklaring om de gegevens permanent bij te werken.