2009-03-25 1 views
2

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

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

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

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

ответ

11

MySQL выполняет преобразование набора символов «на лету» к чему-то, что называется connection charset. Вы можете указать эту кодировку с помощью SQL Statement

SET NAMES utf8 

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

mysql_set_charset("utf8", $conn); 

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

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

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

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

+0

спасибо. Я делаю так, чтобы система задавала запрос систематически до вставки и выбора данных. это не помогло. Мой вопрос действительно больше о том, как php и конечный браузер манипулируют данными sql и как управлять им. – pixeline

0

В ADITION к тому, что сказал Эмиль H, вам также нужно это в вашей странице head тэга:

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

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

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

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

SET NAMES utf8 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^