Почему мне нужно использовать 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(), чтобы преобразовать символ £ в &pound; но это выводит &Acirc;&pound; вместо! Даже когда я использую дополнительные параметры для 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")
Другие вопросы по тегам