#10801: In zipfile, support different encodings for the header and the filenames. Patch by MvL, test by Eli Bendersky.

This commit is contained in:
Georg Brandl 2011-01-01 10:09:32 +00:00
parent d30a0dd681
commit 5ba11de845
4 changed files with 24 additions and 1 deletions

View File

@ -6,6 +6,7 @@ except ImportError:
import io
import os
import sys
import imp
import time
import shutil
@ -23,6 +24,7 @@ from test.support import TESTFN, run_unittest, findfile, unlink
TESTFN2 = TESTFN + "2"
TESTFNDIR = TESTFN + "d"
FIXEDTEST_SIZE = 1000
DATAFILES_DIR = 'zipfile_datafiles'
SMALL_TEST_DATA = [('_ziptest1', '1q2w3e4r5t'),
('ziptest2dir/_ziptest2', 'qawsedrftg'),
@ -487,6 +489,18 @@ class TestsWithSourceFile(unittest.TestCase):
except zipfile.BadZipFile:
self.assertTrue(zipfp2.fp is None, 'zipfp is not closed')
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')
with zipfile.ZipFile(fname) as zipfp:
zipfp.extractall()
def tearDown(self):
unlink(TESTFN)
unlink(TESTFN2)

Binary file not shown.

View File

@ -930,7 +930,13 @@ class ZipFile:
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:
if not self._filePassed:
zef_file.close()
raise BadZipFile(

View File

@ -20,6 +20,9 @@ Core and Builtins
Library
-------
- Issue #10801: In zipfile, support different encodings for the header and
the filenames.
- Issue #6285: IDLE no longer crashes on missing help file; patch by Scott
David Daniels.