PHP で文字列を圧縮しようとしていますが、奇妙な結果が得られます。
ここで見つかったこのコードを試しました
$string = str_repeat('1234567890'.implode('',range('a','z')),48800);
echo strlen($string);//1756800 bytes
$start = microtime(true);
$compressed = gzdeflate($string, 9);
$compressed = gzdeflate($compressed, 9);
$end = microtime(true);
var_dump($compressed);
echo '<br/>'.strlen($compressed).'<br/>';//99 bytes
$star2 = microtime(true);
echo gzinflate(gzinflate($compressed));
$end2 = microtime(true);
echo '</br>- '.($end-$start);
echo '</br>- '.($end2-$star2);
これは、1756800 バイトが 99 バイトになるなど、素晴らしい結果を返します。十分でした。
しかし、実際の文字列を使用してこのソリューションを現実の世界に持ち込むと、3606 バイトの文字列を圧縮しようとしましたが、1765 バイトになり、十分ではありません。
なぜこれ?一部のキャラクターは結果を変えることができますか?
このコードを試して、サイズを 50% 縮小した結果を取得しました。
$text = file_get_contents ('doc/test.txt');
$xml = preg_split('/>/',$text , null, PREG_SPLIT_DELIM_CAPTURE);
unset($xml[0]);
unset($xml[1]);
foreach($xml as $p){
$compact = gzdeflate($p,9);
$compact = gzdeflate($compact,9);
var_dump(strlen($compact));
var_dump(strlen($p));
}
次のような結果が得られました。
int(1760) < compressed
int(3606) < normal
int(2441) < compressed
int(5878) < normal