Bug #72258 [Opn->Ana]: ZipArchive converts filenames to unrecoverable form
Edit report at https://bugs.php.net/bug.php?id=72258&edit=1
ID: 72258
Updated by: ab@php.net
Reported by: speller at yandex dot ru
Summary: ZipArchive converts filenames to unrecoverable form
-Status: Open
+Status: Analyzed
Type: Bug
Package: Zip Related
Operating System: Windows 7
PHP Version: 5.6.21
Block user comment: N
Private report: N
New Comment:
Thanks for the report. The issue is about the discrepancy between the libzip versions used, not
about PHP itself. The libzip moves evermore to UTF-8 making in default in various areas. The version
used in PHP 5.6 explicitly requires the flags that were missed to be synchronized with the new
libzip version.
@speller, a workaround for now:
$fileNameInArc = $zip->getNameIndex($i, 64);
Otherwise the filename will be converted to UTF-8 using the current ACP, which can yield quite weird
results.
Thanks.
Previous Comments:
------------------------------------------------------------------------
[2016-05-24 11:49:21] speller at yandex dot ru
The bug #72200 is about creating new archive and adding files to it. This issue is about reading
archive. Also, I point your view to the fact that two versions of the official PHP binary produce
*different* results.
------------------------------------------------------------------------
[2016-05-24 10:29:34] cmb@php.net
That might be related to bug #72200.
------------------------------------------------------------------------
[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)