Iets in uw code verwerkt de string niet als UTF8. Het kan uw PHP/HTML zijn, het kan in uw verbinding met de DB zijn, of het kan de DB zelf zijn - alles moet consistent worden ingesteld als UTF8, en als er iets niet is, wordt de string precies afgekapt zoals u zien bij het passeren van een UTF8/niet-UTF8-grens.
Ik ga ervan uit dat uw database UTF8-compatibel is - dat is het gemakkelijkst te controleren. Merk op dat de sortering kan worden ingesteld op serverniveau, databaseniveau, tabelniveau en kolomniveau binnen de tabel. Het instellen van UTF8-sortering op de kolom zou al het andere voor opslag moeten overschrijven, maar de anderen zullen nog steeds beginnen wanneer ze met de DB praten als ze niet ook UTF8 zijn. Als u het niet zeker weet, stelt u de verbinding expliciet in op UTF8 nadat u deze hebt geopend:
$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
Nu zijn uw DB en verbinding UTF8, zorg ervoor dat uw webpagina dat ook is. Nogmaals, dit kan op meer dan één plaats worden ingesteld (.htaccess, php.ini). Als je het niet zeker weet / geen toegang hebt, overschrijf dan gewoon wat PHP als standaard oppikt bovenaan je pagina:
<?php ini_set('default_charset', 'UTF-8'); ?>
Houd er rekening mee dat u het bovenstaande direct aan het begin wilt hebben, voordat er tekst van uw pagina wordt uitgevoerd. Zodra tekst wordt uitgevoerd, is het mogelijk te laat om te proberen een codering op te geven - u bent mogelijk al opgesloten in wat standaard op uw server is. Ik herhaal dit dan ook in mijn headers (mogelijk overkill):
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
</head>
En ik negeer het ook op formulieren waar ik gegevens aanneem:
<FORM NAME="utf8-test" METHOD="POST" ACTION="utf8-test.php" enctype="multipart/form-data" accept-charset="UTF-8">"
Om eerlijk te zijn, als je de codering bovenaan hebt ingesteld, begrijp ik dat de andere overschrijvingen niet vereist zijn - maar ik bewaar ze toch, omdat het ook niets kapot maakt, en ik zou liever gewoon de expliciet coderen, laat de server dan aannames doen.
Ten slotte vermeldde je dat je in phpMyAdmin de string hebt ingevoegd en het zag er zoals verwacht uit - weet je zeker dat de phpMyAdmin-pagina's UTF8 zijn? Ik denk niet dat ze dat zijn. Wanneer ik UTF8-gegevens van mijn PHP-code opsla, ziet het eruit als onbewerkte 8-bits tekens in phpMyAdmin. Als ik dezelfde string neem en direct opsla in phpMyAdmin, ziet het er 'correct' uit. Dus ik vermoed dat phpMyAdmin de standaardtekenset van mijn lokale server gebruikt, niet noodzakelijk UTF8.
De volgende string is bijvoorbeeld opgeslagen van mijn webpagina:
I can’t wait
Leest als volgt in mijn phpMyAdmin:
I can’t wait
Wees dus voorzichtig bij het testen op die manier, aangezien u niet echt weet welke codering phpMyAdmin gebruikt voor weergave of DB-verbinding.
Als je nog steeds problemen ondervindt, probeer dan mijn onderstaande code. Eerst maak ik een tabel om de tekst in UTF8 op te slaan:
CREATE TABLE IF NOT EXISTS `utf8_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`my_text` varchar(8000) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
En hier is wat PHP om het te testen. Het neemt in feite uw invoer op een formulier, herhaalt die invoer naar u en slaat de tekst op / haalt de tekst op uit de DB. Zoals ik al zei, als u de gegevens rechtstreeks in phpMyAdmin bekijkt, ziet u misschien dat het er niet goed uitziet, maar via de onderstaande pagina zou het er altijd moeten uitzien zoals verwacht, omdat de pagina- en db-verbinding beide zijn vergrendeld met UTF8.
<?php
// Override whatever is set in php.ini
ini_set('default_charset', 'UTF-8');
// The following should not be required with the above override
//header('Content-Type:text/html; charset=UTF-8');
// Open the database
$dbh = new PDO('mysql:dbname=utf8db;host=127.0.0.1;charset=utf8', 'root', 'password');
// Set the connection to UTF8
$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
// Tell MySql to do the parameter replacement, not PDO
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// Throw exceptions (and break the code) if a query is bad
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$id = 0;
if (isset($_POST["StoreText"]))
{
$stmt = $dbh->prepare('INSERT INTO utf8_test (my_text) VALUES (:my_text)');
$stmt->execute(array(':my_text' => $_POST['my_text']));
$id = $dbh->lastInsertId();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<title>UTF-8 Test</title>
</head>
<body>
<?php
// If something was posted, output it
if (isset($_POST['my_text']))
{
echo "POSTED<br>\n";
echo $_POST['my_text'] . "<br>\n";
}
// If something was written to the database, read it back, and output it
if ($id > 0)
{
$stmt = $dbh->prepare('SELECT my_text FROM utf8_test WHERE id = :id');
$stmt->execute(array(':id' => $id));
if ($result = $stmt->fetch())
{
echo "STORED<br>\n";
echo $result['my_text'] . "<br>\n";
}
}
// Create a form to take some user input
echo "<FORM NAME=\"utf8-test\" METHOD=\"POST\" ACTION=\"utf8-test.php\" enctype=\"multipart/form-data\" accept-charset=\"UTF-8\">";
echo "<br>";
echo "<textarea name=\"my_text\" rows=\"20\" cols=\"90\">";
// If something was posted, include it on the form
if (isset($_POST['my_text']))
{
echo $_POST['my_text'];
}
echo "</textarea>";
echo "<br>";
echo "<INPUT TYPE = \"Submit\" Name = \"StoreText\" VALUE=\"Store It\" />";
echo "</FORM>";
?>
<br>
</body>
</html>