Несоответствие кодировки символов - PullRequest
1 голос
/ 02 июля 2010

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

1 голос
/ 02 июля 2010

Директива 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'"));
0 голосов
/ 02 июля 2010

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

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

0 голосов
/ 02 июля 2010

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

другая сторона проблемы (и более конкретно) - проверка mysql символ_сервера и наиболее частая причина символ_с_клиента - см. Также: кодировки соединения

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

...