Почему мне нужно использовать utf8_decode() для моего столбца MySQL, чтобы он отображался правильно?
Я использую CakePHP с App.encoding для UTF-8, <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
присутствует в моем <head>
и моя база данных MySQL установлена на UTF-8 Unicode Encoding и utf8_general_ci collation. у меня тоже есть "encoding"=>"UTF8"
в моих деталях соединения database.php.
Когда я сохраняю символ "£" в таблице базы данных и просматриваю его с помощью командной строки MySQL, символ отображается правильно.
Если я использую CakePHP для извлечения строк из таблицы базы данных и вывода их на своем веб-сайте, я вижу £
вместо моего предназначения £
условное обозначение.
Однако, если я тогда использую utf8_decode()
чтобы вывести мои данные, он отображается правильно.
Это правильно? Я пытался использовать htmlentities(), чтобы преобразовать символ £ в £
но это выводит £
вместо! Даже когда я использую дополнительные параметры для charset.
Возможно, кто-то может помочь - я, должно быть, что-то здесь упустил, но я подумал, что символы должны отображаться правильно (в таких вещах, как HTML-теги textarea), если все ваши заголовки, мета-теги и т. Д. Были последовательно UTF-8?
3 ответа
Похоже, что данные в вашей базе данных неверны: символ £ фактически хранится как два символа £. Вы можете подтвердить это, перейдя в базу данных и используя функции hex и charset:
select charset(MyColumn), hex(MyColumn) from MyTable;
Если столбец закодирован в UTF-8, для значения '£' вы должны увидеть результат, идентичный следующему:
+---------------+-----------+
| utf8 | C2A3 |
+---------------+-----------+
Если вы видите что-то еще, например, если в столбце charset указан latin1 или если в шестнадцатеричном столбце указан C382C2A3, данные в таблице неверны. Это может быть исправлено, хотя, но исправление зависит от вида ошибки, которую имеют данные. Что вы получаете от charset
а также hex
?
Если все в UTF8, удалите "encoding"=>"UTF8"
в вашей детали подключения базы данных.php:
$conn = mysql_connect($server, $username, $password);
//mysql_set_charset("UTF8", $conn); // REMOVED. ;)
mysql_select_db($database, $conn);
Вы можете использовать htmlentities с третьими параметрами для безопасного кодирования UTF-8:
htmlentities("£", ENT_COMPAT, "UTF-8")