hsw 0 Опубликовано: 21 мая 2012 Рассказать Опубликовано: 21 мая 2012 В php v5.4 изменилось поведение htmlspecialchars(). encoding по умолчанию стал UTF-8. Для cp1251 возвращается пустая строка. На сайте ошибки о незаполненных полях (например ajax публикация комментария). $s = $_GET['s']; $s2 = convert_unicode( $s, "windows-1251" ); $s3 = htmlspecialchars( $s2, ENT_QUOTES ); $s4 = htmlspecialchars( $s2, ENT_QUOTES, 'ISO-8859-1'); $s5 = htmlspecialchars( $s2, ENT_QUOTES, 'windows-1251'); var_dump($s, $s2, $s3, $s4, $s5); string(12) "прювет" string(6) "прювет" string(0) "" string(6) "прювет" string(6) "прювет" PS. В FreeBSD порт lang/php5 обновился до v5.4 16 мая. Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 21 мая 2012 Рассказать Опубликовано: 21 мая 2012 Пока непонятно, является ли это багом со стороны PHP или нет, или теперь обнуление строки запланированное ими действие. Мне нужно связаться с разработчиками и получить от них ответ. Этот параметр присутствует еще с линейки PHP 4.1 и он никогда не обнулял строки, даже для строк в кодировке UTF-8, хотя по умолчанию был в 'ISO-8859-1' В документации по новой линейке нет ни малейшего сообщения о несовместимости http://www.php.net/manual/ru/migration54.incompatible.php при работе данной функции. Цитата Ссылка на сообщение Поделиться на других сайтах
hsw 0 Опубликовано: 21 мая 2012 Рассказать Опубликовано: 21 мая 2012 Автор Символы cp1251 являются некорректным utf-8, поэтому срабатывает обработка неправильных символов. Дефолтовое поведение описано в флаге ENT_IGNORE: ENT_IGNORE: Silently discard invalid code unit sequences _instead_of_returning_an_empty_string_. Да и другие варианты флагов не лучше. Видимо придётся делать dle_htmlspecialchars(), который будет подставлять encoding = $config['charset']. Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 21 мая 2012 Рассказать Опубликовано: 21 мая 2012 Да с этим я уже разобрался. Поддержка линейки 5.4 для сайтов в кодировке windows-1251 появится в следующей версии DLE. По что на этой линейке можно использовать DLE 9.6 но только для сайтов в кодировке UTF-8 Цитата Ссылка на сообщение Поделиться на других сайтах
hsw 0 Опубликовано: 21 мая 2012 Рассказать Опубликовано: 21 мая 2012 Автор Может кому пригодится: патч для php 5.4.3 делает cp1251 дефолтом вместо utf8. В php 5.3 был указан cs_8859_1. --- ext/standard/html.c.orig 2012-05-21 18:27:00.000000000 +0400 +++ ext/standard/html.c 2012-05-21 18:31:26.000000000 +0400 @@ -364,13 +364,13 @@ static enum entity_charset determine_charset(char *charset_hint TSRMLS_DC) { int i; - enum entity_charset charset = cs_utf_8; + enum entity_charset charset = cs_cp1251; int len = 0; const zend_encoding *zenc; /* Default is now UTF-8 */ if (charset_hint == NULL) - return cs_utf_8; + return cs_cp1251; if ((len = strlen(charset_hint)) != 0) { goto det_charset; Цитата Ссылка на сообщение Поделиться на других сайтах
RedRoll 67 Опубликовано: 22 мая 2012 Рассказать Опубликовано: 22 мая 2012 Да с этим я уже разобрался. Поддержка линейки 5.4 для сайтов в кодировке windows-1251 появится в следующей версии DLE. По что на этой линейке можно использовать DLE 9.6 но только для сайтов в кодировке UTF-8 не совсем понятна последующая ситуация при обновлении серверов на пхп 5,4 с истекшими к тому моменту лицензиями. покупать поновой и обновляться?)) Цитата Ссылка на сообщение Поделиться на других сайтах
a1ex 60 Опубликовано: 22 мая 2012 Рассказать Опубликовано: 22 мая 2012 Поменять htmlspecialchars(...., ENT_QUOTES ); на htmlspecialchars(..., ENT_QUOTES, 'windows-1251'); не судьба? Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 22 мая 2012 Рассказать Опубликовано: 22 мая 2012 не совсем понятна последующая ситуация при обновлении серверов на пхп 5,4 с истекшими к тому моменту лицензиями. покупать поновой и обновляться?)) Не обновлять PHP, вот и вся последовательность. Зачем обновлять PHP если скрипты не меняются, это вообще ничего не дает. А вообще конечно подобные вопросы лучше задавать вам разработчикам PHP, это же они меняют кардинально поведение старых функций в новых линейках. Цитата Ссылка на сообщение Поделиться на других сайтах
RedRoll 67 Опубликовано: 23 мая 2012 Рассказать Опубликовано: 23 мая 2012 Не обновлять PHP, вот и вся последовательность. Зачем обновлять PHP если скрипты не меняются, это вообще ничего не дает. А вообще конечно подобные вопросы лучше задавать вам разработчикам PHP, это же они меняют кардинально поведение старых функций в новых линейках. острой необходимости в этом нет конечно, но мы, например, стараемся поддерживать по серверов в актуальном состоянии. на серверах не только длешные проекты. со временем патч таки бы не помешал, хотябы для линейкий 9,х Поменять htmlspecialchars(...., ENT_QUOTES ); на htmlspecialchars(..., ENT_QUOTES, 'windows-1251'); не судьба? спасибо, кэп) 1 Цитата Ссылка на сообщение Поделиться на других сайтах
a1ex 60 Опубликовано: 23 мая 2012 Рассказать Опубликовано: 23 мая 2012 спасибо, кэп) Трололо, что за слово модное такое... Интересно каким может быть патч, если это не лечится по другому? Или вам надо сильнее разжевать? в таком фале это менять, в другом это? Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 23 мая 2012 Рассказать Опубликовано: 23 мая 2012 со временем патч таки бы не помешал, хотябы для линейкий 9,х Патчей в данном вопросе быть не может, потому как изменение затрагивает исправлений 90% файлов. но мы, например, стараемся поддерживать по серверов в актуальном состоянии. на серверах не только длешные проекты. Еще хуже сделаете своим клиентам, потому как в данной линейке перестанут работать все сайты в кодировке windows-1251, т.к. это крайне распространенная и массовая функция. И если DLE постоянно обновляется и поддержка данной линейки PHP будет, то там где стоят например самописные скрипты или скрипты которые давно не обновляются, обрушит их сайты. Цитата Ссылка на сообщение Поделиться на других сайтах
a1ex 60 Опубликовано: 23 мая 2012 Рассказать Опубликовано: 23 мая 2012 Я бы предложил сделать так htmlspecialchars(..., ENT_QUOTES | (!defined('ENT_SUBSTITUTE')?ENT_IGNORE:ENT_SUBSTITUTE), $config['charset'] ); Цитата Ссылка на сообщение Поделиться на других сайтах
RedRoll 67 Опубликовано: 23 мая 2012 Рассказать Опубликовано: 23 мая 2012 Патчей в данном вопросе быть не может, потому как изменение затрагивает исправлений 90% файлов. да, именно, и вручную если перебирать - это нерентабельно если спецификация устоится и будет принята и в последующих версиях, в т.ч. 6ой и т.д. - с вас бесплатное обновление на истекшие лицензии) Еще хуже сделаете своим клиентам, потому как в данной линейке перестанут работать все сайты в кодировке windows-1251, т.к. это крайне распространенная и массовая функция. И если DLE постоянно обновляется и поддержка данной линейки PHP будет, то там где стоят например самописные скрипты или скрипты которые давно не обновляются, обрушит их сайты. да это понятно, но это уже проблемы не разработчика дле. меня интересует сохранение базовой работы скрипта, в случае, если таки обновлять пхп придется Трололо, что за слово модное такое... Интересно каким может быть патч, если это не лечится по другому? Или вам надо сильнее разжевать? в таком фале это менять, в другом это? камрад, ты самоутверждаешься так, когда х###ю пишешь? Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 23 мая 2012 Рассказать Опубликовано: 23 мая 2012 если спецификация устоится и будет принята и в последующих версиях, в т.ч. 6ой Она уже устоялось, этот вопрос решенный - с вас бесплатное обновление на истекшие лицензии) Без проблем, обращаетесь к разработчикам PHP, требуете оплаты лицензии с них, они оплачивают, вы получаете бесплатно. Это же они изменили принципы работы старых функций, а не DLE их изменил. 1 Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.