Проблема с кодированием при хранении HTML в mySQL с использованием PHP - PullRequest
1 голос
/ 16 ноября 2011

Я создал CMS, которая позволяет хранить HTML в базе данных.Все началось очень просто.Я отобразил HTML в текстовой области, используя htmlspecialchars, чтобы он не нарушал форму.Затем сохраните его обратно, используя html_specialchars_decode.Казалось, что все работало нормально, пока кто-то не вставил в систему какой-то HTML, а не набрал текст.В этот момент он хранился нормально, но потерял большую часть пустого пространства, что означало, что все прекрасные отступы должны были быть сделаны с нуля.

Чтобы исправить это, я попытался указать все в кодировке utf-8, потому что любая попытка манипулировать им приводила к неправильным символам.

Я указываю utf-8 в заголовке PHP

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

Я указываю utf-8 на моей странице HTML

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

Я указываю utf-8 в HTMLform

<form accept-charset="utf-8" 

Затем я прочитал опубликованное значение (в основном) так:

$Val = $_POST[$SafeFieldName];

Насколько я понимаю, PHP делал все в utf-8, поэтому я немного удивлен этимэтап, на котором я получаю болванку - если я сейчас не сделаю это:

$Val = utf8_decode($Val);

Итак, на этом этапе - это работает - вроде.Я теряю все мои прекрасные отступы, но не все мое пустое пространство.Это как если бы некоторые не utf8 символы были удалены.Как ни странно, я использую Chrome, но в Firefox все выглядит нормально

Я думаю, что сейчас я просто завязываю себя.Какие-нибудь изящные предложения?Мне нужно докопаться до сути, а не взломать его, чтобы заставить его работать.

Ответы [ 4 ]

3 голосов
/ 16 ноября 2011

Соединение с БД и сами таблицы БД должно поддерживать UTF-8.Убедитесь, что параметры сортировки вашей таблицы - utf8_general_ci и что все строковые поля в таблице также имеют параметры сортировки utf8_general_ci.

Соединение с БД также должно быть UTF-8:

mysql_set_charset('utf8');

См. http://akrabat.com/php/utf8-php-and-mysql/ для получения дополнительной информации.

Обновление: некоторые сообщают, что иногда требуется также

mysql_query('SET NAMES utf8');

!

При создании таблиц и подключении UTF-8это невозможно, вы, конечно, можете сохранить HTML-код в виде данных, закодированных в BASE64, и декодировать его обратно при повторном извлечении из БД.

0 голосов
/ 17 ноября 2011

Сортировано - и ответ действительно смущает - но вы никогда не знаете, однажды кому-то может понадобиться это:)

Я заметил, что в Firefox это работает по-другому (но все еще довольно глупо), поэтому я взглянул на свою таблицу стилей и обнаружил следующее:

white-space: nowrap;

Кто-то (я), должно быть, добавил это туда, чтобы попытаться заставить горизонтальную прокрутку работать в каком-то браузере. Без этого HTML проходит весь путь до БД и обратно.

Мой единственный другой вопрос состоял в том, зачем мне это нужно, поскольку все это должно было прибыть в utf8

$ Val = utf8_decode ($ Val);

Волшебно - теперь мне это не нужно.

0 голосов
/ 16 ноября 2011

Если это проблема в и из MySQL (как вы предложили в заголовке), то вам нужно убедиться, что столбцы и таблицы имеют UTF8-BIN и ставят mysql_set_charset('utf8'); после открытия соединения с MySQL.

0 голосов
/ 16 ноября 2011

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

...