HTML Purifier выборочно поедает специальные символы

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

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

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

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

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

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


person Glazius    schedule 14.05.2009    source источник


Ответы (1)


  1. текстовое поле, закодированное с помощью javascript escape()

escape небезопасен для не-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, когда вы снова выводите строку.

person troelskn    schedule 14.05.2009
comment
Система в том виде, в котором она была, могла прекрасно обрабатывать умные кавычки, так что я не сомневался в своих способностях UTF. encodeURIComponent отлично справляется с HTMLPurifier, спасибо. Но я вижу %20s в $_POST. Как ни странно, decodeURIComponent жалуется на недопустимые URI, когда я пытаюсь запустить его на результирующей странице, хотя unescape работает нормально. Есть идеи? - person Glazius; 14.05.2009
comment
Умные кавычки не являются гарантией работы utf-8. Некоторые клиенты интерпретируют iso-8859-1 как cp-1252, если он содержит умные кавычки. Вам нужно перепроверить весь конвейер. Попробуйте заставить его работать с простой html-формой, прежде чем добавлять JS поверх нее. Попробуйте протестировать китайские иероглифы, так как их нет ни в cp-1252, ни в iso-8859-1. - person troelskn; 14.05.2009