Набор символов php mysql: сохранение html международного контента

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

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

у меня есть utf8_encode или utf8_decode? note: для кодировки символов html-страницы задано значение utf8.

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

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 в браузере, но utf8 в MySQL.)

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

Я настоятельно рекомендую прочитать эту статью « Абсолютный минимум. Каждый разработчик программного обеспечения абсолютно уверен, должен знать об Unicode и наборах символов (без оправданий!) » Джоэла Спольски, чтобы понять, что вы делаете и почему.

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

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

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

  SET NAMES utf8 

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

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

В соответствии с тем, что сказал Эмиль Х, вам также нужно это в своем теге заголовка страницы:

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