2016-08-10 3 views
1

Возьмите выход gzdeflate(), например:Скопируйте/вставьте многобайтную строку из gzdeflate?

$a = gzdeflate('..........'); 
echo $a . "\n" . strlen($a); 

я получаю выход, как:

?Ӄ 
5 

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

Очевидно, echo gzinflate('?Ӄ'); не работает, но echo gzinflate($a).

Есть ли способ получить фактическое содержимое $a в мой буфер обмена или вывести его таким образом, чтобы я мог скопировать и вставить его в gzinflate() для извлечения исходной строки? Единственный способ решения проблемы я нашел что-то вроде:

$a = base64_encode(gzdeflate('..........')); 
echo $a; 

Который дает мне:

09ODAQA= 

Этого достаточно, чтобы сделать дружеский echo gzinflate(base64_decode('09ODAQA=')); и получить .........., но я хотел бы, чтобы пропустить функции base64, если возможное.

ответ

3

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

Если это происходит в командной строке, вы можете использовать , не отображая фактического содержимого. Возьмите команды OS X в pbcopy и pbpaste:

$ php test.php | pbcopy 
$ pbpaste | someotherprogram 

Если требуется видимое текстовое представление, вам необходимо убедиться, что выход ASCII-сейф (или по крайней мере «Unicode безопасно»), а не в виде необработанных двоичных данные. Для этого вам понадобится база 64 или шестнадцатеричная кодировка двоичных данных.

+0

Спасибо - да, видимое текстовое представление - это то, что мне нужно - знаете ли вы, какой способ получить такой вывод непосредственно из любых *** функций сжатия без использования второй функции кодирования? Это необязательно должно быть 'gzdeflate()' – billynoah

+0

Это действительно навредило бы цели такой функции сжатия. – deceze

+0

не обязательно. Результат здесь 5 байтов, а исходная строка - 10. По сути, я ищу полезное текстовое представление, которое по-прежнему остается всего 5 байтов. – billynoah

0

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

Вы можете поместить эту строку в любой файл (file_put_contents()) и открыть этот файл, например, throw notepad ++. и вы увидите эти специальные символы в этом файле.

+0

Не совсем ... попробовал это в возвышенном виде и получил 'd3d3 8301 00', который я предполагаю, является шестнадцатеричным кодом и не может быть раздутым, как есть – billynoah

+0

Да, вы можете видеть, что это 5 байт, и система просто съедает этот символ - ___00___ – mishanon

Смежные вопросы