(original) (raw)
changeset: 70183:1f0f0e317873 branch: 3.1 parent: 70172:28e410eb86af user: Victor Stinner victor.stinner@haypocalc.com date: Wed May 18 13:43:23 2011 +0200 files: Lib/test/test_zipfile.py Lib/zipfile.py Misc/NEWS description: Backport commit 33543b4e0e5d from Python 3.2: #10801: In zipfile, support different encodings for the header and the filenames. Patch by MvL, test by Eli Bendersky. diff -r 28e410eb86af -r 1f0f0e317873 Lib/test/test_zipfile.py --- a/Lib/test/test_zipfile.py Tue May 17 12:44:54 2011 +0200 +++ b/Lib/test/test_zipfile.py Wed May 18 13:43:23 2011 +0200 @@ -3,7 +3,13 @@ import zlib except ImportError: zlib = None -import zipfile, os, unittest, sys, shutil, struct, io +import io +import os +import shutil +import struct +import sys +import unittest +import zipfile from tempfile import TemporaryFile from random import randint, random @@ -14,6 +20,7 @@ TESTFN2 = TESTFN + "2" TESTFNDIR = TESTFN + "d" FIXEDTEST_SIZE = 1000 +DATAFILES_DIR = 'zipfile_datafiles' SMALL_TEST_DATA = [('_ziptest1', '1q2w3e4r5t'), ('ziptest2dir/_ziptest2', 'qawsedrftg'), @@ -387,9 +394,25 @@ orig_zip.writestr(zinfo, data) orig_zip.close() + def test_unicode_filenames(self): + if __name__ == '__main__': + myfile = sys.argv[0] + else: + myfile = __file__ + + mydir = os.path.dirname(myfile) or os.curdir + fname = os.path.join(mydir, 'zip_cp437_header.zip') + + print(fname) + zipfp = zipfile.ZipFile(fname) + try: + zipfp.extractall() + finally: + zipfp.close() + def tearDown(self): - os.remove(TESTFN) - os.remove(TESTFN2) + support.unlink(TESTFN) + support.unlink(TESTFN2) class TestZip64InSmallFiles(unittest.TestCase): # These tests test the ZIP64 functionality without using large files, diff -r 28e410eb86af -r 1f0f0e317873 Lib/zipfile.py --- a/Lib/zipfile.py Tue May 17 12:44:54 2011 +0200 +++ b/Lib/zipfile.py Wed May 18 13:43:23 2011 +0200 @@ -928,7 +928,13 @@ if fheader[_FH_EXTRA_FIELD_LENGTH]: zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH]) - if fname != zinfo.orig_filename.encode("utf-8"): + if zinfo.flag_bits & 0x800: + # UTF-8 filename + fname_str = fname.decode("utf-8") + else: + fname_str = fname.decode("cp437") + + if fname_str != zinfo.orig_filename: raise BadZipfile( 'File name in directory %r and header %r differ.' % (zinfo.orig_filename, fname)) diff -r 28e410eb86af -r 1f0f0e317873 Misc/NEWS --- a/Misc/NEWS Tue May 17 12:44:54 2011 +0200 +++ b/Misc/NEWS Wed May 18 13:43:23 2011 +0200 @@ -72,6 +72,9 @@ Library ------- +- Issue #10801: In zipfile, support different encodings for the header and + the filenames. + - Issue #10154, #10090: change the normalization of UTF-8 to "UTF-8" instead of "UTF8" in the locale module as the latter is not supported MacOSX and OpenBSD. /victor.stinner@haypocalc.com