Я знал, что это связано с тем, что Zend Framework делает свои собственные экранирование с использованием htmlspecialchars и utf-8 (если вы не измените это с помощью методов представления setEscape
/ setEncoding
).И действительно, когда вы делаете это:
$test = "wóórd1";
$test = html_entity_decode($test, ENT_COMPAT, "iso-8859-1");
$test = htmlspecialchars($test, ENT_COMPAT, "utf-8");
$test
в конце пусто.
Таким образом, вы должны вызвать html_entity_decode с помощью "utf-8" или изменить кодировку представлений на "iso-8859-1 "(или какая у вас кодировка).Я думаю, что поставка «utf-8» - лучший вариант.
Война против кодировок
Кто бы ни изобрел кодировки символов, он был либо злым гением, либо глупым пещерным человеком.
Чтобы сделать это, вы также должны позаботиться о том, какую кодировку использует браузер, потому что в противном случае вы либо записываете мусор в свою базу данных, либо выводите мусор в свой вывод, либо и то, и другое (или ничего, если вы передаете неправильную кодировкунекоторые PHP-функции).(потерпите меня)
Итак, сначала вы должны убедиться, какую кодировку использует браузер.Это может быть достигнуто следующими способами:
- заголовки ответа HTTP
- метатег Content-Type (основной параметр в ZF)
метатег типа контента в вашем HTML-выводе и какую кодировку он предлагает.Если метаинформация типа контента отсутствует или не содержит информацию о кодировке, вам следует добавить ее, желательно с utf-8, в свой макет (если вы не используете макет, сейчас самое время начать с него)).Это важно, иначе вы точно не знаете, какую кодировку вы вводите или какую кодировку вы должны передать браузеру.Это означает, что нечто подобное происходит после открытия <head>
-Tag каждой страницы, возвращаемой вашим приложением:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
В следующих примерах мы предполагаем, что вы выбираете utf-8, но вы можете использовать все, что подходит- если вы измените значения соответствующим образом (это означает s / UTF-8 / вашу кодировку / g).
Теперь, когда вы получаете данные из браузера, вы знаете, какую кодировку вы должны предоставить для вызова htmlentities
(utf-8):
'metaDescription' =>
htmlentities($form->getValue('metaDescription'), ENT_COMPAT, 'UTF-8')
Таким образом, это означает, что $form->getValue('metaDescription')
возвращает строку в кодировке utf-8, которую необходимо преобразовать в строку HTML-сущностей, а это именно то, что нам нужно.
Таким образом, в базе данных теперь есть неугрожающая строка без умлаутов, акцентов или чего-либо еще.
Теперь мы рассмотрим часть редактирования.Там вы должны декодировать HTML-сущности, чтобы пользователь не имел с ними дело.Выходная строка должна быть закодирована с использованием нашей требуемой кодировки (да, верно: utf-8):
$form->setDefault('metaDescription',
html_entity_decode($oldPage->getMetaDescription(), ENT_COMPAT, 'UTF-8'));
Итак, теперь вы присвоили строку в кодировке utf-8, возвращаемую html_entity_decode
для metaDescription
теперь нам нужно пройти только этот вызов htmlspecialchars
, который вызывается по умолчанию, если кто-то использует $view->escape()
.
Последний шаг - убедиться, что Zend_View
encode
знает о нашемкодировка (это необязательно, если вы используете utf-8, так как это уже по умолчанию).Либо установите его для определенного представления в контроллере с помощью $this->view->setEncoding('UTF-8')
, либо для всех представлений в bootstrap.php
:
protected function _initView()
{
$view = new Zend_View();
$view->setEncoding('UTF-8');
$viewRenderer =
Zend_Controller_Action_HelperBroker::getStaticHelper(
'ViewRenderer'
);
$viewRenderer->setView($view);
return $view;
}
Если кто-то сейчас вызывает $view->escape()
, он также ожидает строку utf-8 в качестве ввода,Вы должны быть в состоянии удалить вызов setEscape
с помощью «нулевого» escape.
Если вы выполнили все эти шаги, теперь у вас должны быть все специальные символы с умлаутами, акцентами и могилами, восстановленными по желанию (или я теперь опозорился).
Таким образом, каждая функция получает кодировкуожидает, в противном случае он возвращает печально известную пустую строку (псевдо-блок-схему):
- Браузер -> отправляет данные в UTF-8
htmlentities($browserData, ,'UTF-8')
-> ожидает возврата UTF-8ASCII без умлаутов или других причудливых вещей - База данных хранит ASCII-Text
- - проходит время -
- Затем при редактировании: загрузка ASCII из базы данных
html_entity_decode($dbData, ,'UTF-8')
-> ожидает ASCII, возвращает кодировку UTF-8 - Через
$view->escape()
: htmlspecialchars
-> ожидает UTF-8, возвращает UTF-8 - Браузер -> ожидает UTF-8
tl; dr / recap
- Установите метатег типа контента с нужным набором символов
- Убедитесь, что все функции кодирования / декодирования осведомлены о выбранной вами кодировке (это означает: быть последовательным)