Как можно предотвратить двойное кодирование html-сущностей, когда они разрешены на входе? - PullRequest
4 голосов
/ 09 апреля 2010

Как я могу предотвратить двойное кодирование html-объектов или исправить их программно?

Я использую функцию encode () из модуля perl HTML :: Entities для кодирования HTML-объектов при вводе пользователем. Проблема здесь в том, что мы также позволяем пользователям вводить сущности HTML напрямую, и эти сущности в конечном итоге имеют двойную кодировку.

Например, пользователь может ввести:

Stackoverflow & Perl = Awesome…

В результате кодируется

Stackoverflow & Perl = Awesome…

Это отображается в браузере как

Stackoverflow & Perl = Awesome…

Мы хотим, чтобы это отображалось как

Stackoverflow & Perl = Awesome...

Есть ли способ предотвратить это двойное кодирование? Или есть модуль или фрагмент кода, который может легко исправить эти проблемы двойного кодирования?

Любая помощь очень ценится!

Ответы [ 3 ]

6 голосов
/ 09 апреля 2010

Вы можете сначала декодировать строку:

my $input = from_user();

my $encoded = encode_entities( decode_entities $input );
4 голосов
/ 09 апреля 2010

Существует очень простой способ избежать этого:

  1. Удалить все объекты при вводе (превратить их в Юникод)
  2. Снова закодируйте в сущности на этапе вывода.
1 голос
/ 09 апреля 2010

Попробуйте сохранить вызов в encode() до тех пор, пока не получите значение для отображения, а не до его сохранения. Пока вы последовательны в своем поисковом механизме, дополнительные данные в вашей базе данных, вероятно, не стоит беспокоиться.

Редактировать

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

...