Bug #72200 [Opn]: ZipArchive::open() creates invalidly encoded filenames

From: Date: Tue, 17 May 2016 15:57:15 +0000
Subject: Bug #72200 [Opn]: ZipArchive::open() creates invalidly encoded filenames
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-201158@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72200&edit=1 ID: 72200 User updated by: thomas dot kuhn dot berlin at gmail dot com Reported by: thomas dot kuhn dot berlin at gmail dot com Summary: ZipArchive::open() creates invalidly encoded filenames Status: Open Type: Bug Package: Zip Related Operating System: Windows Server 2012 R2 & Win7 PHP Version: 7.0.6 Block user comment: N Private report: N New Comment: @cmb: oh, sorry, you are right, i apologize :) i copyNpasted your script and executed it on my system, the output was as follows: bool(true) bool(true) bool(true) bool(false) Windows NT 6.1 build 7601 (Windows 7 Professional Edition Service Pack 1) AMD64 PHP/7.0.6 Compiler: MSVC14 (Visual C++ 2015) Architecture: x64 Previous Comments: ------------------------------------------------------------------------ [2016-05-17 13:34:42] cmb@php.net > @cmb: you missed the point: When filenames contain > !!non-us-ascii-letters!! like !!öäü!! or !!asian chars!! etc., Yes, I understood this point. The filename in my script is actually müller encoded as UTF-8. I just wanted to make sure, that we're really dealing with UTF-8, what's not necessarily the case with your script (consider it was stored encoded as something else than ISO-Latin-1; then utf8_encode() might fail). Furthermore I wanted to make the script more portable and generic so it could serve as basis for a .phpt. And it might be useful to check the return value of $zip->close(), too. ------------------------------------------------------------------------ [2016-05-17 12:40:56] thomas dot kuhn dot berlin at gmail dot com @cmb: you missed the point: When filenames contain !!non-us-ascii-letters!! like !!öäü!! or !!asian chars!! etc., ZipArchive creates filenames in a way that those files are not accessible via PHP because the encoding is wrong. and btw !!adding!! files to an archive containing such letters in their filename fails as well. i have to copy them to to tmp-files first :( ------------------------------------------------------------------------ [2016-05-17 12:32:10] cmb@php.net Using the following slightly modified script, I can't reproduce the issue with PHP 7.0.6 (VC14 x86 Non Thread Safe (2016-Apr-29 00:38:17)) on Windows 10: <?php $filename = "m\xc3\xbcller"; $zip = new ZipArchive; var_dump($zip->open($filename, ZipArchive::CREATE|ZipArchive::OVERWRITE)); var_dump($zip->addFromString('foo', 'bar')); var_dump($zip->close()); var_dump(file_exists($filename)); Output bool(true) bool(true) bool(true) bool(true) What results do you get running this script? ------------------------------------------------------------------------ [2016-05-11 16:30:25] thomas dot kuhn dot berlin at gmail dot com Description: ------------ New in PHP7 on Windows: When filenames contain non-us-ascii-letters like öäü or asian chars etc., ZipArchive creates filenames in a way that those files are not accessible via PHP because the encoding is wrong. testscript output PHP 5.5.35: php default_charset: UTF-8 bool(true) testscript output PHP 7.0.6: php default_charset: UTF-8 bool(false) run on Windows Server 2012 R2 and Windows7 Test script: --------------- print "php default_charset: ".ini_get('default_charset')."\n"; // just 4 info (UTF-8) $filename = "bugtest_müller-lüdenscheid.zip"; // just an example $filename = utf8_encode($filename); // simulating my database delivering utf8-string $zip = new ZipArchive(); if( $zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE) === true ) { $zip->addFile('bugtest.php', 'bugtest.php'); // copy of script file itself $zip->close(); } var_dump( is_file($filename) ); // delivers ? ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=72200&edit=1

« previous php.bugs (#201158) next »