Bug #72258 [Opn]: ZipArchive converts filenames to unrecoverableform

From: Date: Tue, 24 May 2016 10:29:37 +0000
Subject: Bug #72258 [Opn]: ZipArchive converts filenames to unrecoverableform
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-201254@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72258&edit=1

 ID:                 72258
 Updated by:         cmb@php.net
 Reported by:        speller at yandex dot ru
 Summary:            ZipArchive converts filenames to unrecoverableform
 Status:             Open
 Type:               Bug
 Package:            Zip Related
 Operating System:   Windows 7
 PHP Version:        5.6.21
 Block user comment: N
 Private report:     N

 New Comment:

That might be related to bug #72200.


Previous Comments:
------------------------------------------------------------------------
[2016-05-24 04:55:09] speller at yandex dot ru

Description:
------------
I have a test zip archive with only one dir named (АБВГД) created under Windows with
Russian locale. If you will look to the zip file in HEX mode you will see the dir name "80 81
82 83 84 2F" (АБВГД/), five 1-byte chars + slash. Under PHP 5.4 the
ZipArchive::getNameIndex function onthis archive returned the name as is - in cp866 encoding. So I
was able to convert it to correct text. After upgrading to PHP 5.6 this function returns names
transcoded to something unrecoverable. The result of the ZipArchive::getNameIndex transcoded by PHP
internally to five *2-bytes* chars + slash! I tried to set default_encoding ini setting, but without
success. So I can not work properly with such archives at all.

Run test script under precompiled PHP 5.4 from the php.net and the same PHP 5.6 and you will see
different results:




Test script:
---------------
<?
echo setlocale(LC_ALL, 'Russian_Russia.20866'), "\n";
ini_set('default_charset', 'cp866');

$zip = new \ZipArchive();
$res = $zip->open('test.zip');
if ($res !== true) {
	echo 'Error opening: ' . $res;
	die();
}


for ($i = 0; $i < $zip->numFiles; $i++) {
	$stat = $zip->statIndex($i);
	$fileNameInArc = $zip->getNameIndex($i);

	echo $fileNameInArc, "\n";
	echo iconv('cp866', 'utf-8', $fileNameInArc), "\n";
}


Expected result:
----------------
php.5.4.32\php test.php
Russian_Russia.20866
АБВГД/
╨Р╨С╨Т╨У╨Ф/


Actual result:
--------------
php.5.6.21\php test.php
Russian_Russia.20866
├З├╝├й├в├д/
тФЬ╨ЧтФЬтХЭтФЬ╨╣тФЬ╨▓тФЬ╨┤/



------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=72258&edit=1


Thread (4 messages)

« previous php.bugs (#201254) next »