Перейти к публикации

php v5.4, htmlspecialchars()


Рекомендованные сообщения

В 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 мая.

Ссылка на сообщение
Поделиться на других сайтах

Пока непонятно, является ли это багом со стороны PHP или нет, или теперь обнуление строки запланированное ими действие. Мне нужно связаться с разработчиками и получить от них ответ. Этот параметр присутствует еще с линейки PHP 4.1 и он никогда не обнулял строки, даже для строк в кодировке UTF-8, хотя по умолчанию был в 'ISO-8859-1' В документации по новой линейке нет ни малейшего сообщения о несовместимости http://www.php.net/manual/ru/migration54.incompatible.php при работе данной функции.

Ссылка на сообщение
Поделиться на других сайтах

Символы cp1251 являются некорректным utf-8, поэтому срабатывает обработка неправильных символов.

Дефолтовое поведение описано в флаге ENT_IGNORE:

ENT_IGNORE: Silently discard invalid code unit sequences _instead_of_returning_an_empty_string_.

Да и другие варианты флагов не лучше.

Видимо придётся делать dle_htmlspecialchars(), который будет подставлять encoding = $config['charset'].

Ссылка на сообщение
Поделиться на других сайтах

Да с этим я уже разобрался. Поддержка линейки 5.4 для сайтов в кодировке windows-1251 появится в следующей версии DLE. По что на этой линейке можно использовать DLE 9.6 но только для сайтов в кодировке UTF-8

Ссылка на сообщение
Поделиться на других сайтах

Может кому пригодится: патч для 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;

Ссылка на сообщение
Поделиться на других сайтах

Да с этим я уже разобрался. Поддержка линейки 5.4 для сайтов в кодировке windows-1251 появится в следующей версии DLE. По что на этой линейке можно использовать DLE 9.6 но только для сайтов в кодировке UTF-8

не совсем понятна последующая ситуация при обновлении серверов на пхп 5,4 с истекшими к тому моменту лицензиями. покупать поновой и обновляться?))

Ссылка на сообщение
Поделиться на других сайтах

не совсем понятна последующая ситуация при обновлении серверов на пхп 5,4 с истекшими к тому моменту лицензиями. покупать поновой и обновляться?))

Не обновлять PHP, вот и вся последовательность. Зачем обновлять PHP если скрипты не меняются, это вообще ничего не дает. А вообще конечно подобные вопросы лучше задавать вам разработчикам PHP, это же они меняют кардинально поведение старых функций в новых линейках.

Ссылка на сообщение
Поделиться на других сайтах

Не обновлять PHP, вот и вся последовательность. Зачем обновлять PHP если скрипты не меняются, это вообще ничего не дает. А вообще конечно подобные вопросы лучше задавать вам разработчикам PHP, это же они меняют кардинально поведение старых функций в новых линейках.

острой необходимости в этом нет конечно, но мы, например, стараемся поддерживать по серверов в актуальном состоянии. на серверах не только длешные проекты. со временем патч таки бы не помешал, хотябы для линейкий 9,х

Поменять

htmlspecialchars(...., ENT_QUOTES );

на

htmlspecialchars(..., ENT_QUOTES, 'windows-1251');

не судьба?

спасибо, кэп)

Ссылка на сообщение
Поделиться на других сайтах

спасибо, кэп)

Трололо, что за слово модное такое...

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

Ссылка на сообщение
Поделиться на других сайтах

со временем патч таки бы не помешал, хотябы для линейкий 9,х

Патчей в данном вопросе быть не может, потому как изменение затрагивает исправлений 90% файлов.

но мы, например, стараемся поддерживать по серверов в актуальном состоянии. на серверах не только длешные проекты.

Еще хуже сделаете своим клиентам, потому как в данной линейке перестанут работать все сайты в кодировке windows-1251, т.к. это крайне распространенная и массовая функция. И если DLE постоянно обновляется и поддержка данной линейки PHP будет, то там где стоят например самописные скрипты или скрипты которые давно не обновляются, обрушит их сайты.

Ссылка на сообщение
Поделиться на других сайтах

Патчей в данном вопросе быть не может, потому как изменение затрагивает исправлений 90% файлов.

да, именно, и вручную если перебирать - это нерентабельно

если спецификация устоится и будет принята и в последующих версиях, в т.ч. 6ой и т.д. - с вас бесплатное обновление на истекшие лицензии)

Еще хуже сделаете своим клиентам, потому как в данной линейке перестанут работать все сайты в кодировке windows-1251, т.к. это крайне распространенная и массовая функция. И если DLE постоянно обновляется и поддержка данной линейки PHP будет, то там где стоят например самописные скрипты или скрипты которые давно не обновляются, обрушит их сайты.

да это понятно, но это уже проблемы не разработчика дле. меня интересует сохранение базовой работы скрипта, в случае, если таки обновлять пхп придется

Трололо, что за слово модное такое...

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

камрад, ты самоутверждаешься так, когда х###ю пишешь?

Ссылка на сообщение
Поделиться на других сайтах

если спецификация устоится и будет принята и в последующих версиях, в т.ч. 6ой

Она уже устоялось, этот вопрос решенный

- с вас бесплатное обновление на истекшие лицензии)

Без проблем, обращаетесь к разработчикам PHP, требуете оплаты лицензии с них, они оплачивают, вы получаете бесплатно. Это же они изменили принципы работы старых функций, а не DLE их изменил.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...