Несоответствие кодировки символов

Мои сценарии определенно сохранены в 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, появится.

Мой вопрос: откуда возникает это несоответствие, и возможно ли, чтобы мои веб-страницы и инструменты базы данных работали безупречно?

3 ответа

Решение

Директива charset в DSN фактически применяется к MSSQL. Мне просто нужно было выполнить SET NAMES, Извини за это.

Я добился этого таким образом:

parent::__construct("{$this->engine}:host={$this->host};dbname={$this->name}",
                    $this->user, $this->password,
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));

Просто конвертируйте € в html-объект & евро; для суперфикса (но вы можете получить проблему с другими специальными символами)

другая сторона проблемы (и более конкретно) - проверка mysql character_set_server и наиболее частая причина character_set_client - seeAlso: наборы соединений

также важно отметить, что метаэквивалент не имеет значения, вы должны всегда устанавливать заголовок ('Content-Type: ...)

Поскольку ваша HTML-страница верна, кажется, что вы храните правильные данные в базе данных.

€ является кодировкой UTF-8 знака евро, неправильно интерпретированной как windows-1252. Похоже, что ваши инструменты Windows используют кодировку "ANSI" вместо кодировки базы данных.

Другие вопросы по тегам