Мои скрипты, безусловно, сохранены в UTF-8. Я создаю PDO с "{$this->engine}:host={$this->host};dbname={$this->name};charset=UTF-8"
. Мои таблицы используют InnoDB и сопоставляются с помощью utf8_general_ci. Мои страницы отправляются либо с заголовком Content-Type: text/html; charset=UTF-8
, либо с эквивалентом <meta>
.Несоответствие кодировки символов
При использовании PDO для хранения символа €, исходящего из ввода HTTP или строкового литерала в исходном коде, я остаюсь с c3 a2 e2 80 9a c2 ac
согласно MySQL Workbench 5.2. Извлечение этого из базы данных и отображение его на странице отлично работает. Однако в phpMyAdmin и Workbench я вижу €
.
При использовании этих двух инструментов для хранения €, я остаюсь с e2 82 ac
, что, по-видимому, является правильным представлением UTF-8, но если я попытаюсь получить и затем вывести его с помощью PHP, отобразится .
Мой вопрос: откуда возникло это несоответствие, и возможно ли, чтобы мои веб-страницы и инструменты баз данных работали безупречно?
Странно, звучит так, будто вы все делаете правильно. Вы на 1000% уверены, что ваше соединение с БД является UTF-8? Можете ли вы отправить запрос «SET NAMES utf8;», чтобы убедиться? –
И ваш браузер игнорирует кодировку? Кодировка является рекомендательной и будет игнорироваться браузером, если вы настроили ее для этого. Является ли поведение одинаковым в разных браузерах? На разных машинах? – Andrew
Для хорошей оценки убедитесь, что ваш PHP-скрипт настроен на использование UTF-8. Если PHP выполняет преобразования символов «на лету», потому что считает, что файлы должны использовать другую таблицу символов ISO, это может объяснить то, что вы видите. 'ini_set ('default_charset', 'UTF-8');' – Andrew