Набор символов PHP MySQL: хранение HTML международного контента - PullRequest
2 голосов
/ 25 марта 2009

Я полностью сбит с толку тем, что я читал о наборах символов. Я разрабатываю интерфейс для хранения французского текста, отформатированного в html, в базе данных mysql.

Что я понял, так это то, что безопасный способ отображения всех французских специальных символов - хранить их как utf8. поэтому я создал базу данных mysql с указанием utf8 для базы данных и каждой таблицы. Через phpmyadmin я вижу, что символы хранятся именно так, как это должно быть. Но вывод этих символов через php дает мне ошибочные результаты: акцентированные символы заменяются бессмысленными. Почему это так?

мне нужно их utf8_encode или utf8_decode? примечание: кодировка html-страницы установлена ​​в utf8.

в целом, каков безопасный способ хранения этих данных? Должен ли я объединить htmlentities, addlashes и utf8_encode при сохранении и strippslashes, html_entity_decode и utf8_decode при выводе?

Ответы [ 4 ]

11 голосов
/ 25 марта 2009

MySQL на лету выполняет преобразование набора символов в нечто, называемое кодировка соединения . Вы можете указать этот набор символов с помощью оператора sql

SET NAMES utf8

или используйте определенную функцию API, такую ​​как mysql_set_charset () :

mysql_set_charset("utf8", $conn);

Если это сделано правильно, нет необходимости использовать такие функции, как utf8_encode () и utf8_decode ().

Вы также должны убедиться, что браузер использует ту же кодировку. Обычно это делается с помощью простого заголовка:

header('Content-type: text/html;charset=utf-8');

(Обратите внимание, что кодировка в браузере называется utf-8 , но в MySQL utf8 .)

В большинстве случаев единственное, что вам нужно отслеживать, - это кодировка соединения и веб-кодировка, поэтому, если она все еще не работает, возможно, вы что-то делаете неправильно. Попробуйте немного поэкспериментировать с этим, обычно требуется некоторое время, чтобы полностью понять.

2 голосов
/ 25 марта 2009
1 голос
/ 25 марта 2009

Полезно рассмотреть сгенерированный PHP интерфейс и отдельный компонент MySQL. MySQL не должен беспокоиться о логике отображения, а PHP не должен предполагать, что бэкэнд выполняет какую-либо предварительную обработку данных.

Мой совет - хранить данные в виде простых символов, используя кодировку utf8, и избегать любых опасных символов с помощью методов MySQLs. Затем PHP читает данные из базы данных в кодировке utf8, обрабатывает их (чаще всего с помощью htmlentities ()) и отображает их с помощью любого шаблона, который вы выберете.

Эмиль Х. правильно предложил использовать

 SET NAMES utf8

которое должно быть первым, что вы вызываете после установления соединения с MySQL. Это заставляет MySQL обрабатывать весь ввод и вывод как utf8.

Обратите внимание, что если вам нужно использовать функции utf8_encode или utf8_decode, вы неправильно настраиваете кодировку html. Проще всего потребовать, чтобы каждый компонент вашей системы использовал utf8, поскольку таким образом вам никогда не придется выполнять ручное кодирование / декодирование, что может впоследствии привести к трудностям при отслеживании проблем.

0 голосов
/ 25 марта 2009

В дополнение к тому, что сказал Эмиль Н, это также необходимо на вашей странице

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
...