Внутри code выводятся юникод значения
У меня всплыла такая проблема - внутри тега <code>...</code> выводятся юникод значения для ряда символов:
& → & ' → #039; (вначале амперсанд) " → " < → < > → > Происходит это не на всей странице, а только в комментариях. Может есть css-свойство которое принудительно отобразит нормальные символы, а не эти значения для символов? Или в чём тут может быть проблема? Комментарии добавляются из поля textarea. Кодировка у страницы прописана utf-8. В тексте эти символы отображаются нормально, а внутри тега <code> выводятся значения. При редактировании комментария, в поле textarea опять же выводятся вместо символов их значения. Кто нибудь сталкивался с таким? Есть ли решение этой проблемы? |
Не используй innerHTML\html().
|
Тут такая заморочка, комментарии выводятся через php.
А на уровне скрипта, значения из textarea как берутся, так и вставляются через метод value: let txt = textarea.value; Это неправильно? |
MC-XOBAHCK,
это не юникод, а html сущности, и коли они приходят с сервера, то на сервере и происходит - htmlspecialchars. С другой стороны - попробуйте в тег code вставить html код без преобразований < и >, и не получится отобразить код. |
Цитата:
Вот и спрашиваю может кто сталкивался с таким что внутри code выводятся эти сущности (значения), а не их символы. Возможно этому есть решение. Преобразование идёт средствами laravel, при получении ajax-запроса (это комментарии на сайте). |
Цитата:
<code></code> <textarea>< & ></textarea> <script> document.querySelector('code').textContent = document.querySelector('textarea').value; alert(document.querySelector('code').textContent.length); </script> Тоже самое будет и при вставке как html. Ищите там, где производится преобразование (на сервере), убирайте его. Но сервер такое делает при выводе не потому, что так красиво, а для того чтобы предотвратить XSS атаку, так что смотрите и анализируйте. PS. Суть проблемы не понятна - если сервер отдает сущности, то клиент будет отображать не их, а символы. Другое дело, если сервер отдает сущности, а клиент также производит преобразование символов, вот тогда отобразится не символ, а его сущность. По вашим словам клиент этого не делает, а данные с сервера, так что в чем проблема не понятно. |
Покажу всё в скринах.
Вот скрин как это выводится, где видно проблему: ![]() Скрин из БД значение оригинала комментария (с синтаксисом Markdown): ![]() Скрин - значение в ячейке с html: ![]() |
Вот же блин. Теперь на скринах вижу что амперсанд внутри pre code каким то образом из сущности символа (все сущности начинаются с амперсанда) ещё раз компильнулся в сущность амперсанда. Вот поэтому у меня такая лажа.
Блин, блин, блин... У меня с регулярками в js не очень, а тут нужно в php как то теперь придумывать решение. Блин... |
Если вы будете в базе держать преобразованное в сущности, то это уже проблема. А вот при выводе в клиента такое преобразование требуется, конечно если не требуется вывод HTML.
Но, все же происходит на уровне браузера, никаких querySelector('...) не требуется (кстати, это ошибка синтаксиса). Вот код: <textarea>< & ></textarea> Тем не менее в текстовом поле отображаться будет < & >, и если сделать вставку этого значения в тег code, а затем вывести из тега как replace(/&/, '&'), то результатом будет < & >, а никак не &lt; & &gt; Вы действительно запутались в чем-то. |
laimas, я это понимаю. Я так понял вы увидели на последнем скрине в последней строчке что происходит. Это не я, это laravel такое сделал.
Я в php из маркдауна в html компилирую такой строкой: comment_html = Markdown::parse($comment); В js никаких replace я не делаю. Проблема наверное в том, что $comment я получаю из ajax-запроса, при этом происходит замена символов на сущности для защиты от XSS-атак. Второй раз, наверное, замена символов на сущности происходит при компиляции из маркдауна в хтмл. В общем, нужно пересмотреть код сохранения комментария в БД, чтоб два раза не того. Спасибо за помощь! |
Часовой пояс GMT +3, время: 12:24. |