@@ -515,7 +515,7 @@ def __repr__(self):
515515 result .append ('>' )
516516 return '' .join (result )
517517
518- def FileHeader (self , zip64 = None ):
518+ def FileHeader (self , zip64 = None , metadata_encoding = None ):
519519 """Return the per-file header as a bytes object.
520520
521521 When the optional zip64 arg is None rather than a bool, we will
@@ -557,17 +557,17 @@ def FileHeader(self, zip64=None):
557557
558558 self .extract_version = max (min_version , self .extract_version )
559559 self .create_version = max (min_version , self .create_version )
560- filename , flag_bits = self ._encodeFilenameFlags ()
560+ filename , flag_bits = self ._encodeFilenameFlags (metadata_encoding )
561561 header = struct .pack (structFileHeader , stringFileHeader ,
562562 self .extract_version , self .reserved , flag_bits ,
563563 self .compress_type , dostime , dosdate , CRC ,
564564 compress_size , file_size ,
565565 len (filename ), len (extra ))
566566 return header + filename + extra
567567
568- def _encodeFilenameFlags (self ):
568+ def _encodeFilenameFlags (self , metadata_encoding ):
569569 try :
570- return self .filename .encode ('ascii' ), self .flag_bits
570+ return self .filename .encode (metadata_encoding or 'ascii' ), self .flag_bits
571571 except UnicodeEncodeError :
572572 return self .filename .encode ('utf-8' ), self .flag_bits | _MASK_UTF_FILENAME
573573
@@ -1370,7 +1370,7 @@ def close(self):
13701370 # Preserve current position in file
13711371 self ._zipfile .start_dir = self ._fileobj .tell ()
13721372 self ._fileobj .seek (self ._zinfo .header_offset )
1373- self ._fileobj .write (self ._zinfo .FileHeader (self ._zip64 ))
1373+ self ._fileobj .write (self ._zinfo .FileHeader (self ._zip64 , self . metadata_encoding ))
13741374 self ._fileobj .seek (self ._zipfile .start_dir )
13751375
13761376 # Successfully written: Add file to our caches
@@ -1435,9 +1435,9 @@ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True,
14351435 self .metadata_encoding = metadata_encoding
14361436
14371437 # Check that we don't try to write with nonconforming codecs
1438- if self .metadata_encoding and mode != 'r' :
1439- raise ValueError (
1440- "metadata_encoding is only supported for reading files" )
1438+ # if self.metadata_encoding and mode != 'r':
1439+ # raise ValueError(
1440+ # "metadata_encoding is only supported for reading files")
14411441
14421442 # Check if we were passed a file-like object
14431443 if isinstance (file , os .PathLike ):
@@ -1830,7 +1830,7 @@ def _open_to_write(self, zinfo, force_zip64=False):
18301830 self ._writecheck (zinfo )
18311831 self ._didModify = True
18321832
1833- self .fp .write (zinfo .FileHeader (zip64 ))
1833+ self .fp .write (zinfo .FileHeader (zip64 , self . metadata_encoding ))
18341834
18351835 self ._writing = True
18361836 return _ZipWriteFile (self , zinfo , zip64 )
@@ -2062,7 +2062,7 @@ def mkdir(self, zinfo_or_directory_name, mode=511):
20622062
20632063 self .filelist .append (zinfo )
20642064 self .NameToInfo [zinfo .filename ] = zinfo
2065- self .fp .write (zinfo .FileHeader (False ))
2065+ self .fp .write (zinfo .FileHeader (False , self . metadata_encoding ))
20662066 self .start_dir = self .fp .tell ()
20672067
20682068 def __del__ (self ):
@@ -2133,7 +2133,7 @@ def _write_end_record(self):
21332133
21342134 extract_version = max (min_version , zinfo .extract_version )
21352135 create_version = max (min_version , zinfo .create_version )
2136- filename , flag_bits = zinfo ._encodeFilenameFlags ()
2136+ filename , flag_bits = zinfo ._encodeFilenameFlags (self . metadata_encoding )
21372137 centdir = struct .pack (structCentralDir ,
21382138 stringCentralDir , create_version ,
21392139 zinfo .create_system , extract_version , zinfo .reserved ,
0 commit comments