Строковые функции и binary-safe

korpus

злой бобёр
Строковые функции и binary-safe

Что означает binary-safe применительно к строковым функциям?
Насколько я понимаю, бинарный режим - это режим, позволяющий отображать символы как есть и без различных манипуляций с символами перевода строки. Так в Windows и Unix используются различные символы для обозначения перевода строки, а PHP умеет "сглаживать" эти разногласия (не в бинарном режиме).
Но не понятно, как binary-safe применять к строковым функциям?
Есть строковые функции, например такие: strtr(), explode(), которые являются binary-safe, а также могут использоваться в строках с юникодом.
Но есть строковые функции, которые являются binary-safe, но для юникода не приспособлены. Например строковая функция http://php.net/manual/en/function.substr-replace.php . Зачем вообще нужно делать эту функцию binary-safe? С юникодом она использоваться не может, так как ей в качестве параметров передаётся позиция внутри строки, а в юникоде позицию строки указывать бессмысленно. Простая проверка некоторых binary-safe функций говорит о том, что для юникода их использовать нельзя. Тогда для чего вообще нужны такие функции?
 

dimagolov

Новичок
binary-safe это значит, что можно обрабатывать бинарные данные, то есть байтики со значением от 0 до 255. это нужно потому, что в PHP нет отдельного типа для строк, а отдельного для бинарных данных и в строках может быть все, что угодно.

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

korpus

злой бобёр
Автор оригинала: dimagolov
binary-safe это значит, что можно обрабатывать бинарные данные, то есть байтики со значением от 0 до 255. это нужно потому, что в PHP нет отдельного типа для строк, а отдельного для бинарных данных и в строках может быть все, что угодно.
Строки ведь это и есть последовательность байтиков от 0 до 255 :) И они и есть бинарные данные, вроде как. А пример можно привести, когда обычная функция начнёт проигрывать в чём-либо binary-safe?
Спасибо за ответ в теме, но мне это ничего не разъяснило :(

-~{}~ 08.09.10 17:56:

Может быть binary-safe связано как-то с локалью?
 

Вурдалак

Продвинутый новичок
Эти функции работают с байтами, а не символами. Binary-safe также означает, что функции «адекватно» воспримут любые байты. Например, в C активно используются т.н. null-terminated string, т.е. набор байт, заканчивающимся нулевым (0x00). Это позволяет не знать заранее размер строки. Если ты попытаешься «скромить» строку с нулевым байтом, например, include, то сам 0x00 и всё, что после него, будет проигнорировано (я правда не знаю на каком уровне именно происходит «разрыв» строки, но это не особо интересно).

Функции, связанные каким-то образом с локалью (strtolower, strtoupper etc) по определению работают с символами (правда только однобайтовых кодировок), а не байтами.

-~{}~ 08.09.10 18:11:

P.S. В PHP все строки являются структурой с длиной строки и ссылкой на саму строку в памяти, поэтому проблем с нулевым байтом и нет.
 

korpus

злой бобёр
Вурдалак Вобщем понятненько.

Вот например такой код:
Код:
<?php
$stroka='s s s s'.chr(0). 'd d d';
echo $stroka;
?>
выведет в браузер всю строку вплоть до символов d d d, в какой бы кодировке она не была.
Про include проверил только что, действительно так и есть. Значит include() не binary-safe :)
 

Вурдалак

Продвинутый новичок
Нулевой байт не имеет какого-то особого значения в PHP. Я уже пояснил почему.
 

korpus

злой бобёр
Автор оригинала: Вурдалак
Нулевой байт не имеет какого-то особого значения в PHP. Я уже пояснил почему.
Я уже стёр эту строку...

-~{}~ 08.09.10 18:49:

Вурдалак, спасибо! Это очень важные сведения про binary-safe и нулевой байт.

-~{}~ 09.09.10 17:29:

Как дополнение к всему вышесказаному.
http://php.net/manual/en/function.setlocale.php
Локаль влияет на сравнение строк и конвертацию символов (в верхний регистр или наоборот). Значит binary-safe функции не зависят от локали.
Но с другой стороны, в мануале написано, что strtolower() является binary-safe, что ещё более запутывает дело =). Эх, не всё так просто...
 
Сверху