Php 如何确定字符串是否被压缩?

Php 如何确定字符串是否被压缩?,php,string,compression,Php,String,Compression,如何确定字符串是否被压缩(调用前后比较字符串大小的部分,或者这是正确的方法)?字符串和压缩字符串都只是字节序列。您无法真正区分一个字节序列和另一个字节序列。您应该从随附的元数据中知道字节块是否表示压缩格式 如果您确实需要通过编程进行猜测,您可以尝试以下几种方法: 尝试解压缩字符串并查看解压缩操作是否成功。如果失败,字节可能不代表压缩字符串 尝试检查是否有明显的“奇怪”字节,如0x20之前的任何字节。这些字节通常不在常规文本中使用。但是,并不能保证它们出现在压缩字符串中 用于查看字符串在您怀疑的

如何确定字符串是否被压缩(调用前后比较字符串大小的部分,或者这是正确的方法)?

字符串和压缩字符串都只是字节序列。您无法真正区分一个字节序列和另一个字节序列。您应该从随附的元数据中知道字节块是否表示压缩格式

如果您确实需要通过编程进行猜测,您可以尝试以下几种方法:

  • 尝试解压缩字符串并查看解压缩操作是否成功。如果失败,字节可能不代表压缩字符串
  • 尝试检查是否有明显的“奇怪”字节,如
    0x20
    之前的任何字节。这些字节通常不在常规文本中使用。但是,并不能保证它们出现在压缩字符串中
  • 用于查看字符串在您怀疑的编码中是否有效。如果不是,则可能是压缩的(或者您检查了错误的编码)。需要注意的是,实际上任何字节序列在几乎每个单字节编码中都是有效的,所以这只适用于多字节编码
PRE:
我想,如果您发送一个请求,您可以立即查看
$http\u response\u header
,查看数组中的一个项目是否是
内容编码:gzip
的变体。但这太差劲了
有一种更好的方法。

下面是如何… 检查它是否为GZIP。像个老板

根据:

gzip内容的标题如下所示
ID1
ID2
将内容标识为GZIP。并且
CM
声明
ZLIB\u编码
(压缩方法)是
ZLIB\u编码
——这是GZIP通常用于所有web服务器的

并且它们具有固定值:

  • ID1的值为
    “\x1f”
  • ID2的值为
    “\x8b”
  • CM的值为
    “\x08”
    (或仅为8…)
差不多了:
$is_gzip=0==mb_strpos($summary_string,“\x1f”“\x8b”“\x08”)

工作示例
这项工作对我来说很好:

if (@gzuncompress($_xml)!==false) {
   // gzipped sring

对不起,我太笨了,但是我该如何执行第一个要点呢?当我对未压缩字符串调用
gzuncompress
时,它不会返回错误,只是返回相同的字符串。嗯,它会为我返回
false
<代码>变量转储(gzuncompress('foobar')请注意,“\t”(制表符)、“\n”(换行符)和“\r”(回车符)都可能位于任何字符串中,并且都低于0x20。对于d字符串来说效果很好,但对于没有gzip头的ed字符串来说效果不好,所以我会:
函数isgzip($in){if(mb strpos($in,“\x1f”“\x8b”“\x08”)==0){return true;}否则如果(@gzuncompress($in)!==false){return true;}否则{return false;}}
@futta-很好的补充,b.t.w.你仍然应该保留
“US-ASCII”
(在
mb\u strops
中)…你的解决方案非常有效!
<?php
/** @link https://gist.github.com/eladkarako/d8f3addf4e3be92bae96#file-checking_gzip_like_a_boss-php */

date_default_timezone_set("Asia/Jerusalem");

while (ob_get_level() > 0) ob_end_flush();
mb_language("uni");
@mb_internal_encoding('UTF-8');
setlocale(LC_ALL, 'en_US.UTF-8');

header('Time-Zone: Asia/Jerusalem');
header('Charset: UTF-8');
header('Content-Encoding: UTF-8');
header('Content-Type: text/plain; charset=UTF-8');
header('Access-Control-Allow-Origin: *');

function get($url, $cookie = '') {
  $html = @file_get_contents($url, false, stream_context_create([
    'http' => [
      'method' => "GET",
      'header' => implode("\r\n", [''
        , 'Pragma: no-cache'
        , 'Cache-Control: no-cache'
        , 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2310.0 Safari/537.36'
        , 'DNT: 1'
        , 'Accept-Language: en-US,en;q=0.8'
        , 'Accept: text/plain'
        , 'X-Forwarded-For: ' . implode(', ', array_unique(array_filter(array_map(function ($item) { return filter_input(INPUT_SERVER, $item, FILTER_SANITIZE_SPECIAL_CHARS); }, ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'HTTP_CLIENT_IP', 'SERVER_ADDR', 'REMOTE_ADDR']), function ($item) { return null !== $item; })))
        , 'Referer: http://eladkarako.com'
        , 'Connection: close'
        , 'Cookie: ' . $cookie
        , 'Accept-Encoding: gzip'
      ])
    ]]));

  $is_gzip = 0 === mb_strpos($html, "\x1f" . "\x8b" . "\x08", 0, "US-ASCII");

  return $is_gzip ? zlib_decode($html, ZLIB_ENCODING_DEFLATE) : $html;
}

$html = get('http://www.pogdesign.co.uk/cat/');

echo $html;
if (@gzuncompress($_xml)!==false) {
   // gzipped sring