Issue #13664: GzipFile now supports non-ascii Unicode filenames.
This commit is contained in:
parent
55bf20ad6e
commit
54edfb3eef
13
Lib/gzip.py
13
Lib/gzip.py
|
@ -164,9 +164,16 @@ class GzipFile(io.BufferedIOBase):
|
|||
def _write_gzip_header(self):
|
||||
self.fileobj.write('\037\213') # magic header
|
||||
self.fileobj.write('\010') # compression method
|
||||
fname = os.path.basename(self.name)
|
||||
if fname.endswith(".gz"):
|
||||
fname = fname[:-3]
|
||||
try:
|
||||
# RFC 1952 requires the FNAME field to be Latin-1. Do not
|
||||
# include filenames that cannot be represented that way.
|
||||
fname = os.path.basename(self.name)
|
||||
if not isinstance(fname, str):
|
||||
fname = fname.encode('latin-1')
|
||||
if fname.endswith('.gz'):
|
||||
fname = fname[:-3]
|
||||
except UnicodeEncodeError:
|
||||
fname = ''
|
||||
flags = 0
|
||||
if fname:
|
||||
flags = FNAME
|
||||
|
|
|
@ -30,6 +30,17 @@ class TestGzip(unittest.TestCase):
|
|||
def tearDown(self):
|
||||
test_support.unlink(self.filename)
|
||||
|
||||
@test_support.requires_unicode
|
||||
def test_unicode_filename(self):
|
||||
unicode_filename = test_support.TESTFN_UNICODE
|
||||
with gzip.GzipFile(unicode_filename, "wb") as f:
|
||||
f.write(data1 * 50)
|
||||
with gzip.GzipFile(unicode_filename, "rb") as f:
|
||||
self.assertEqual(f.read(), data1 * 50)
|
||||
# Sanity check that we are actually operating on the right file.
|
||||
with open(unicode_filename, 'rb') as fobj, \
|
||||
gzip.GzipFile(fileobj=fobj, mode="rb") as f:
|
||||
self.assertEqual(f.read(), data1 * 50)
|
||||
|
||||
def test_write(self):
|
||||
with gzip.GzipFile(self.filename, 'wb') as f:
|
||||
|
|
Loading…
Reference in New Issue