Сжатие строки, конечный результат без разрывов строк?

Я пытаюсь сжать любую заданную строку в более короткую версию, скопировать сжатую строку с возможностью вставки, которая не содержит разрывов строк.

Я попробовал gzcompress, но затем скопировал/вставил результат в другой php-скрипт и попытался gzuncompress выдать «Предупреждение: gzuncompress(): ошибка данных»

Есть ли какая-нибудь встроенная функция php, которая сжимает строку, и в результате получается строка без разрывов строк?

Спасибо.


person Andrei Serdeliuc ॐ    schedule 02.11.2009    source источник
comment
$str = str_replace(\n, , $str); ?   -  person Waleed Amjad    schedule 02.11.2009


Ответы (3)


Вы можете попробовать base64_encode/base64_decode. Если вы сжимаете в двоичный файл для вырезания и вставки, я бы посоветовал вам сначала закодировать его в base64.

person Dan Breen    schedule 02.11.2009
comment
Я должен был упомянуть, что моя цель — получить более короткую версию исходного текста. - person Andrei Serdeliuc ॐ; 02.11.2009
comment
Вы по-прежнему можете использовать алгоритм сжатия, но если вы сразу закодируете полученный двоичный файл в base64, он хорошо подойдет для вырезания и вставки. - person Dan Breen; 02.11.2009
comment
Я пробовал: echo strlen($string); echo strlen(base64_encode(gzcompress($string))); Результат: 185, 188 - person Andrei Serdeliuc ॐ; 02.11.2009
comment
Я думаю, что с такими маленькими строками сжатие не так полезно, а base64 делает его длиннее. С большими данными это будет иметь более заметное значение. - person Dan Breen; 02.11.2009
comment
Лучший ответ. base64_encode действительно имеет значение с более длинными строками. - person Andrei Serdeliuc ॐ; 03.11.2009

вы можете избежать разрывов строк после сжатия: запустите gzcompress() в своей строке, замените разрывы строк известной парой из 2 символов в сжатом результате. чтобы распаковать, замените известные 2 пары символов на разрывы строк, затем запустите gzuncompress()...

на самом деле вам нужно будет выполнить 2 замены. так как я не могу выразить это по-английски (не мой родной язык), вот пример: используйте «+n», чтобы избежать разрывов строк. сначала вам нужно экранировать каждый «+», который стоит отдельно, так как если за ним следует «n», он будет случайно заменен разрывом строки при распаковке; давайте выберем «++» для экранирования «+». затем замените разрывы строк на «+n». при распаковке замените каждую пару «+n» на разрыв строки, затем каждую пару «++» на «+». Это оно !

person Adrien Plisson    schedule 02.11.2009
comment
эхо str_replace(PHP_EOL, '', gzcompress($string)); по-прежнему возвращает многострочный результат, поэтому я предполагаю, что он не будет работать, поскольку невидимые символы, составляющие новую строку, на самом деле не являются разрывами строк? - person Andrei Serdeliuc ॐ; 02.11.2009
comment
не будут ли они одной новой строкой или переводом строки ('\ r' и '\ n')? во всяком случае, я, кажется, помню, что вывод zip является двоичным, поэтому я не понимаю, как вы собираетесь компенсировать все непечатаемые символы... - person Adrien Plisson; 02.11.2009
comment
Техника Адриана Плиссона известна как вставка байтов (используется в RFC 1055 SLIP, асинхронном кадрировании HDLC, JPEG, согласованной вставке служебных байтов и т. д.). Это хорошо работает, когда запрещенные байты относительно редки. Однако другие методы - base64, Ascii85, basE91 и т. д. могут работать лучше, когда запрещенные байты встречаются относительно часто. - person David Cary; 24.08.2011

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

person Tim    schedule 02.11.2009