За последние 24 часа нас посетил 16491 программист и 1314 роботов. Сейчас ищут 1987 программистов ...

Измененения в работе htmlspecialchars() при переходе с php 5.3 на php 5.4

Тема в разделе "Прочие вопросы по PHP", создана пользователем Геон, 13 июл 2016.

  1. Геон

    Геон Активный пользователь

    С нами с:
    23 июл 2013
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    из Москвы
    Столкнулся с проблемой описанной в статье: http://blog.portal.kharkov.ua/2012/09/16/php54-bug/

    У меня кодировка страницы 'cp1251'. В PHP 5.6 функция:
    PHP:
    1. htmlspecialchars($string, ENT_QUOTES);
    возвращает пустую строку. Проблема проявляется начиная с PHP 5.4

    Изменил на:
    PHP:
    1. htmlspecialchars($string, ENT_QUOTES, 'cp1251');
    в PHP 5.6 код заработал нормально.

    Вариант (тоже предложенный в статье):
    PHP:
    1. htmlspecialchars($string, NULL, '');
    в PHP 5.6 возвращает пустую строку (в PHP 5.4 работает нормально)

    Попутно возник вопрос: в CMS которую я "ковыряю" есть еще функция html_entity_decode(). Про нее в статье ничего не сказано. В ней тоже, для корректной работы, нужно кодировку явно указывать?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    По документации можно? https://secure.php.net/manual/ru/function.html-entity-decode.php
    Что тест показал?
     
  3. Геон

    Геон Активный пользователь

    С нами с:
    23 июл 2013
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    из Москвы
    Код:
    PHP:
    1. header('Content-Type: text/html; charset= cp1251');
    2.  
    3. $string = '&"'."'".'<>Привет, мир!';
    4. echo 'Начальная строка1: '.$string."<br>\r\n<br>\r\n";
    5.  
    6. echo 'После htmlspecialchars($string, ENT_QUOTES): '.htmlspecialchars($string, ENT_QUOTES)."<br>\r\n";
    7. echo 'После htmlspecialchars($string, ENT_QUOTES, "cp1251"): '.htmlspecialchars($string, ENT_QUOTES, "cp1251")."<br>\r\n<br>\r\n";
    8.  
    9. echo 'После htmlentities($string, ENT_QUOTES): '.htmlentities($string, ENT_QUOTES)."<br>\r\n";
    10. echo 'После htmlentities($string, ENT_QUOTES, "cp1251"): '.htmlentities($string, ENT_QUOTES, "cp1251")."<br>\r\n<br>\r\n";
    11.  
    12. $string = htmlentities($string, ENT_QUOTES, 'cp1251');
    13. echo 'Начальная строка2: '.$string."<br>\r\n<br>\r\n";
    14.  
    15. echo 'После html_entity_decode($string, ENT_QUOTES): '.html_entity_decode($string, ENT_QUOTES)."<br>\r\n";
    16. echo 'После html_entity_decode($string, ENT_QUOTES, "cp1251"): '.html_entity_decode($string, ENT_QUOTES, "cp1251");
    выполненный в PHP 5.6, формирует страницу:
    HTML:
    1. Начальная строка1: &"'<>Привет, мир!<br>
    2. <br>
    3. После htmlspecialchars($string, ENT_QUOTES): <br>
    4. После htmlspecialchars($string, ENT_QUOTES, "cp1251"): &amp;&quot;&#039;&lt;&gt;Привет, мир!<br>
    5. <br>
    6. После htmlentities($string, ENT_QUOTES): <br>
    7. После htmlentities($string, ENT_QUOTES, "cp1251"): &amp;&quot;&#039;&lt;&gt;Привет, мир!<br>
    8. <br>
    9. Начальная строка2: &amp;&quot;&#039;&lt;&gt;Привет, мир!<br>
    10. <br>
    11. После html_entity_decode($string, ENT_QUOTES): &"'<>Привет, мир!<br>
    12. После html_entity_decode($string, ENT_QUOTES, "cp1251"): &"'<>Привет, мир!
    Функции: htmlspecialchars(); htmlentities() - в PHP 5.6, при формировании страницы с кодировкой 'cp1251', корректно работают только c указанием 'cp1251'.

    Функция html_entity_decode(): что с 'cp1251'; что без 'cp1251' - срабатывает одинаково.

    Вывод
    : указание кодировки 'cp1251' в html_entity_decode() необязательно... Вроде как...

    Или, для правильного стиля программирования, все же рекомендуется указывать кодировку?
     
    #3 Геон, 13 июл 2016
    Последнее редактирование: 13 июл 2016
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Если у тебя файлы PHP в UTF-8 и например ты работаешь с другими текстовыми файлами и там windows-1251, то тогда указывай кодировку.
    Если коротко указывай если там другая кодировка чем в проекте.