Bug #71034 [Fbk->Nab]: Can't add UTF-8 filenames as UTF-8 to ZIP archive
| From: | ab@php.net | Date: | Sun, 06 Dec 2015 16:37:30 +0000 |
| Subject: | Bug #71034 [Fbk->Nab]: Can't add UTF-8 filenames as UTF-8 to ZIP archive | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-197636@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=71034&edit=1
ID: 71034
Updated by: ab@php.net
Reported by: slavikca at gmail dot com
Summary: Can't add UTF-8 filenames as UTF-8 to ZIP archive
-Status: Feedback
+Status: Not a bug
Type: Bug
Package: Zip Related
Operating System: Ubuntu 14.04
PHP Version: 5.6.16
Block user comment: N
Private report: N
New Comment:
Thanks for the additional info. It seems that it is not a bug in PHP. In 7.0.0, i use
$zip->addFile(__FILE__, "\u{442}\u{435}\u{441}\u{442}123.txt");
which effectively adds a file named ÑеÑÑ123.txt to the zip archive. This is what I see
in my terminal
$ unzip -l -U bug71034.zip
Archive: bug71034.zip
Length Date Time Name
--------- ---------- ----- ----
319 2015-12-06 17:25 ÑеÑÑ123.txt
--------- -------
319 1 file
Same i get with your original piece of code.
Please note, in the description you list to see the following:
/var/www/test/web/#U0442#U0435#U0441#U0442123
That means terminal is not in UTF-8. It is not critical for the PHP behavior, but it avoids any
possible misinterpretation when you list out the results. So were worth it to configure.
so after all, the issue on your side appears to be that the filename you pass to ext/zip is not
UTF-8. Consequently that name is stored into the zip file. It is weird given all your locale is
UTF-8 and the PHP file with the hard coded file name as well, but it is the only explanation for the
behavior. The filename can be forced to UTF-8 when you fe convert it with iconv and pass it as
second argument to ZipArchive::addFile().
Thanks.
Previous Comments:
------------------------------------------------------------------------
[2015-12-05 06:48:20] slavikca at gmail dot com
Also, today tried to test with this system:
- PHP 7.0.0
- Ubuntu 14.04
- Zip version 1.13.0
- Libzip version 1.0.1
Same results. Archive created with filenames stored not in UTF-8.
Here is phpinfo page (may be removed later):
http://dev.slavikf.com/info.php
------------------------------------------------------------------------
[2015-12-05 02:24:58] slavikca at gmail dot com
1) is the current locale UTF-8
2) is the terminal charset UTF-8
Yes, all my locales are UTF-8:
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
3) is the actual filename string used in PHP UTF-8, especially the filename is hardcoded - your
script is UTF-8 encoded file
If your question about file, where I have PHP code, then - yes:
$ file index.php
index.php: PHP script, UTF-8 Unicode text
If you are saying, that I need to force PHP to use string in UTF-8 - I do not know, how to do it. Do
I have to use some commands / flags?
------------------------------------------------------------------------
[2015-12-05 02:07:15] ab@php.net
Please check the following:
- is the current locale UTF-8
- is the terminal charset UTF-8
- is the actual filename string used in PHP UTF-8, especially the filename is hardcoded - your
script is UTF-8 encoded file
Only if all of these match, it could be a bug in PHP on in libzip.
Thanks.
------------------------------------------------------------------------
[2015-12-04 21:45:39] slavikca at gmail dot com
In case, if it was not clear from my original issue description:
output of "unzip" from linux shows UTF-8 characters. So, that is example of adding
filename correctly, in UTF-8.
output of "unzip" from file, create in PHP shows filename seemingly correctly (same as
original), but it is not in UTF-8.
That's bad, because it will show correct filename only in the systems with same locale
settings. If it is different - it will be garbled. But UTF-8 will work correctly 100% on any system
(which supports UTF-8) with any locale.
------------------------------------------------------------------------
[2015-12-04 21:36:15] slavikca at gmail dot com
Description:
------------
*Steps to reproduce*
- use ZipArchive to archive file, which has UTF-8 characters in it.
Test script:
---------------
<?php
$zip = new ZipArchive();
if ($zip->open("test.zip", ZIPARCHIVE::CREATE) !== true)
die ("Failed to create archive");
if (!$zip->addFile("/var/www/test/web/ÑеÑÑ123")) //here are UTF-8
characters in the filename
print ("Failure adding file");
$zip->close();
Expected result:
----------------
the name of archived file will be stored as UTF-8
Actual result:
--------------
file successfully archived. But it's names stored not in UTF-8.
To see, if filename was stored au UTF-8 or not, you can use "-U" option in unzip utility:
Here is output for archive created in PHP:
# unzip -l -U test.zip
...
/var/www/test/web/ÑеÑÑ123
Here is output for archive created by linux zip utility:
# unzip -l -U test2.zip
...
/var/www/test/web/#U0442#U0435#U0441#U0442123
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=71034&edit=1