HTML Purifier выборочно ест специальные символы - PullRequest
2 голосов
/ 14 мая 2009

Использование PHP против базы данных, совместимой с UTF-8. Вот как вводится.

  1. ввод пользовательских типов в textarea
  2. текстовая область, закодированная с помощью escape-кода javascript ()
  3. передано через HTTP-сообщение
  4. декодируется с помощью PHP rawurldecode ()
  5. прошло через HTMLPurifier с настройками по умолчанию
  6. сбежал для MySQL и сохранен в базе данных

И это получается обычным способом, и я запускаю unescape () при загрузке страницы. Это позволяет людям, скажем, копировать и вставлять непосредственно из текстового документа и отображать умные цитаты.

Но HTMLPurifier, похоже, забивает специальные символы, не относящиеся к UTF-8, те, которые экранируют () в простое выражение%, такое как Ö, которое экранируется в% D6, тогда как смарт-кавычки экранируются в% u2024 или что-то подобное и попадают в базу данных сюда. Он удаляет как специальный символ, так и следующий сразу за ним.

Мне нужно что-то изменить в этом процессе. Возможно, мне нужно изменить несколько вещей.

Что я могу сделать, чтобы не загромождать специальные символы?

1 Ответ

5 голосов
/ 14 мая 2009
  1. текстовая область, закодированная с помощью escape-кода javascript ()

escape небезопасно для non-ascii. Используйте escapeURIComponent

  1. передано через HTTP-сообщение

Я предполагаю, что вы используете XmlHttpRequest? Если нет, убедитесь, что страница, содержащая форму, используется как utf-8.

  1. декодируется с помощью PHP rawurldecode ()

Если вы получаете доступ к значению через $_POST, вам не следует его декодировать, поскольку это уже сделано. Это может испортить данные.

  1. экранирован для MySQL и хранится в базе данных

Убедитесь, что у вас не включено magic quotes. Убедитесь, что база данных хранит таблицы как utf-8 (в кодировке и параметры сортировки должны быть оба utf-8). Убедитесь, что соединение между php и MySql установлено в utf-8 (используйте set names utf8, если вы не используете PDO).

Наконец, убедитесь, что страница снова используется как utf-8, когда вы снова выводите строку.

...