powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Символ #0 в строках PHP
25 сообщений из 37, страница 1 из 2
Символ #0 в строках PHP
    #38533349
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Архивирую строку с текстом в РНР.
Вроде ничего сложного, функции архивации в РНР есть.
А что будет если в сжатой строке появится символ Chr(0)?
Помнится у других языков программирования на этом строка считается завершонной.
А как обстоит делов с РНР? (может я зря волнуюсь? может он дружит с этим символом и для него нет проблем?)
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38533377
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверка этого вопроса заняла бы меньше чем написание текста.
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38533596
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowпроверка этого вопроса заняла бы меньше чем написание текста.Проверка не дала бы ответа о безопасности наличия символа #0. Его наличие в строке может быть частным случаем... Скажем в Delphi объявляешь строковую переменную в обработчике, и она 100 раз подрат будет пустой, а потом бах и окажется заполненной всякой всячиной. Тоже частный случай...
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38534383
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyА что будет если в сжатой строке появится символ Chr(0)?

сжатая строка будет обрезана по этот символ. А с чего бы вдруг ему там появлятся ?
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38534786
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artasА с чего бы вдруг ему там появлятся ?
Ну я же не могу гарантировать что в сжатой последовательности (которая по сути является бинарным кодом) не встретится символ Chr(0). Тысячу раз фаил заархивировал и у тебя всё нормально, а в тысячапервом бах и появится нулевой символ и строка обрежется и уже не сможет быть разархивированной.
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38534877
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artasInterSkyА что будет если в сжатой строке появится символ Chr(0)?

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

Вообще-то в php не будет :) Не знаю с чего такой вывод, но попробуйте выполнить:
Код: php
1.
2.
    $str = "hello with null >>".chr(0).chr(0)."<< chars";
    echo $str;


и сами убедитесь.

InterSkyПроверка не дала бы ответа о безопасности наличия символа #0. Его наличие в строке может быть частным случаем... Скажем в Delphi объявляешь строковую переменную в обработчике, и она 100 раз подрат будет пустой, а потом бах и окажется заполненной всякой всячиной. Тоже частный случай...


В программировании не бывает частных случаев :). Один и тот же код не будет отрабатывать по-разному при тех же условиях.
В Дэлфи так происходит потому, что ячейки памяти, выделяемые под локальные переменные не обнуляются (а зачем, если например я создам массив, и решу его сразу записать значениями). Потому там нету никаких "частных случаев", а просто правило - перед чтением переменной её надо записать.

В данном случае подобные нюансы отсутствуют.
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535105
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я по этому и спрашиваю у тех кто знает...
А то кто его знает, один раз увидел Chr(0), а потом какой-нибудь Flush пройдёт и подожмёт строки до первых нулей...
В конце концов в РНР много сюрпризов, например:
Код: php
1.
if (0=='txt') echo 'True'; else echo 'False';

Данный код вернёт True.
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535111
st_st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSky,

Сравнение делается через "===". А вообще такое поведение нормально .
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535377
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyЯ по этому и спрашиваю у тех кто знает...
А то кто его знает, один раз увидел Chr(0), а потом какой-нибудь Flush пройдёт и подожмёт строки до первых нулей...
В конце концов в РНР много сюрпризов, например:
Код: php
1.
if (0=='txt') echo 'True'; else echo 'False';

Данный код вернёт True.

Это не сюрприз (после перехода с delphi у меня тоже были проблемы с нестрогим сравнением и с процедурой приведения типов, но просто надо было разобраться).

в отличие от строгого сравнения (===) при нестрогом сравнении типы переменных приводятся к одному и только тогда сравниваются. Это делается всегда по правилу, более сложный тип приводится к более простому (если так можно выразится). Потому при сравнении двух переменных разного типа, int приводится к boolean, float к int или boolean, string к float или int или boolean и т.д.

Потому то, попробуйте привести "txt" к типу int... что у Вас получится? )) дааа... 0... а теперь сравниваем if(0==0)... что получаем? правильно - true :)
А вот если вместо "txt" написать "1txt", то уже получим false (так как "1txt" после приведения к типу int будет равно 1)
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535442
st_st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё javascript есть, в нём всё наоборот (или в php всё наоборот) и alert(0=='txt') вернёт false. Также как и две разные строки - ("37127371298379127398733" == "37127371298379127398734") в php это true, а в js false. Это web, здесь всё серьёзно
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535577
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_stА ещё javascript есть, в нём всё наоборот (или в php всё наоборот) и alert(0=='txt') вернёт false. Также как и две разные строки - ("37127371298379127398733" == "37127371298379127398734") в php это true, а в js false. Это web, здесь всё серьёзно

Ага... а вот "37127371298379127398733b" == "37127371298379127398734b" уже вернёт false. Видимо php по умолчанию все строки вида /^\d+$/ старается сравнивать как integer, а строки /\d+.\d+/ как float. (соответственно в первом случае всё, что больше максимума для integer будет приравниваться к этому максимуму, а во втором просто точность в 14 знаков, а остальное отбрасывается)
))) Кстати, об этом не знал... спасибо :) буду внимательнее следить за строками, если в них есть только цифры.
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535616
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тред нечетателей документации.
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535674
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowтред нечетателей документации.

Киньте пожалуйста ссылку на доки, где данное поведение обосновывается (или хотя бы упоминается).
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535683
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.php.net/manual/en/language.operators.comparison.php
авторIf you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically. These rules also apply to the switch statement. The type conversion does not take place when the comparison is === or !== as this involves comparing the type as well as the value.
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535711
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow http://www.php.net/manual/en/language.operators.comparison.php
авторIf you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically. These rules also apply to the switch statement. The type conversion does not take place when the comparison is === or !== as this involves comparing the type as well as the value.

хм) правда есть. спасибо.
Не понятна мне конечно причина такого поведения, но ладно... разрабам виднее ))
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535717
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНе понятна мне конечно причина такого поведения, но ладно
эм? если просто то потому что у нас есть язык с нестрогой типизацией ВЕЗДЕ.
если сложно - то http://lxr.php.net/xref/PHP_5_4/Zend/zend_operators.c#1402
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535807
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавторНе понятна мне конечно причина такого поведения, но ладно
эм? если просто то потому что у нас есть язык с нестрогой типизацией ВЕЗДЕ.
если сложно - то http://lxr.php.net/xref/PHP_5_4/Zend/zend_operators.c#1402

При сравнении двух значений, определяется тип двух переменных и если обе имеют тип string, то отправляется в функцию, которая сначала преобразовывает обе строки в числа (если это возможно) и потом, если произошло переполнение, то идёт переход по ссылке string_cmp (не знаю, может это что стандартное, но я не нашёл данной ссылки в указанном файле), иначе выполняется сравнение двух числовых значений полученных от преобразований.

Непонятно 2 момента (я так понимаю Вы в теме, может сможете объяснить, а то я совсем не въезжаю):
1. почему проверка на переполнение не сработала (там я вижу ещё уйма условий проверяется, может в них дело... не влазил в самую глубину)?
2. а вообще, нафиг это надо (когда сверяем 2 строки). Если например предполагается, что мы хотим сравнить числа записанные в строках, то достаточно проверить обе строки по регулярке /^\d+(\.\d+)?$/ и если есть совпадение у обеих строк, то просто добираем строки нулями так, что бы до точки и после неё количество символов было одинаковым. После чего проводим как и обычно посимвольную сверку строк :)
Разве так не легче и не более правильно?
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535861
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
товарищь лейтенант - подумайте (С).
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38535915
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

Думал перед тем, как написать, после этого. После Вашего ответа тоже думал... да вот не придумывается. В методе разработчиков есть какая-то сверхумная хитрость?
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38537344
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрВ методе разработчиков есть какая-то сверхумная хитрость?
Эта хитрость внедрена по просьбе АНБ :)
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38537389
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyПрограмёрВ методе разработчиков есть какая-то сверхумная хитрость?
Эта хитрость внедрена по просьбе АНБ :)

То есть рассказать никто не сможет? И через сколько предполагается рассекретить?
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38537486
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверять регуляркой ВСЕ строки в слабо типизированном языке - медленно.
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38537487
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нафик - это надо. потому что через эту функцию работает половина php. это его принцип и фундамент.
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38537530
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowпроверять регуляркой ВСЕ строки в слабо типизированном языке - медленно.

Вообще, в стандартном случае это не дольше, чем переводить строку в число :) Но учитывая особенность ПХП, где переменная хранится сразу во всех возможных типах (насколько я помню), согласен, будут затраты времени на лишние проверки.

Ну что ж, надо привыкнуть строки сравнивать операцией строгого сравнения :)
...
Рейтинг: 0 / 0
Символ #0 в строках PHP
    #38537676
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНо учитывая особенность ПХП, где переменная хранится сразу во всех возможных типах (насколько я помню),
нет. ровно в одном типе
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Символ #0 в строках PHP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]