Lors du passage d'un fichier zip sur Mac-> Windows (environnement japonais), le code de caractère du nom de fichier reste utf-8 avec la compression zip par défaut Mac, et des caractères déformés se produisent lors de la décompression sous Windows. Il est possible d'installer un logiciel tel que MacWinZip pour le compresser afin que cela ne se produise pas, mais l'installation est quelque peu gênante. J'ai donc créé un script de compression Zip pour Windows qui s'exécute sur Python 2.7.
Avec OSX Yosemite que j'utilise, les fichiers zip créés sous Windows peuvent être décompressés sans problème, mais dans des environnements tels que Linux, le nom du fichier sjis peut être déformé, donc dans ce cas, changez le nom du fichier. Utilisez un script qui change en utf-8 et décompresse (Exemple de script de décompression).
$ python win_zip.py <Le chemin du dossier que vous souhaitez compresser>
__ Code (win_zip.py) __
# coding:utf-8
import os, sys, zipfile, shutil
from unicodedata import normalize
def mac_path_to_sjis(mac_path):
#Le problème est résolu car le nom de fichier de mac a divisé les points troubles.
#Si vous ne le faites pas, vous obtiendrez une exception où la turbidité ne peut pas être changée en sjis.
norm_path = normalize('NFC', unicode(mac_path,'utf8'))
return norm_path.encode('sjis')
def check_yes_no(message):
# raw_input returns the empty string for "enter"
yes = set(['yes','y'])
no = set(['no','n'])
choice = raw_input(message + os.linesep).lower()
if choice in yes:
return True
elif choice in no:
return False
else:
print "Please respond with 'yes' or 'no'"
return check_yes_no(message) # loop
def zip_dir(in_dir_path):
in_parent_path, in_dirname = os.path.split(in_dir_path)
os.chdir(in_parent_path)
with zipfile.ZipFile(in_dirname + '.zip', 'w') as zip_file:
for parent_path, dirs, files in os.walk(in_dirname):
sjis_dir_path = mac_path_to_sjis(parent_path)
os.makedirs(sjis_dir_path)
for fname in files:
if fname[0] == '.': continue # ignore all secret file
file_path = os.sep.join((parent_path, fname)) # path of original file
print 'zipping : {0}'.format(file_path)
sjis_file_path = mac_path_to_sjis(file_path)
if file_path == sjis_file_path:
zip_file.write(file_path) # file name is all alphabet
else:
shutil.copyfile(file_path, sjis_file_path) # copy file in sjis file name
zip_file.write(sjis_file_path)
os.remove(sjis_file_path) # remove sjis format file
# remove parent folder in sjis format
os.removedirs(sjis_dir_path)
if __name__ == '__main__':
if len(sys.argv) != 2:
sys.exit('Only 1 argument(path of directory) has to be specified as argument!')
zip_target_path = sys.argv[1]
if os.path.exists(zip_target_path) == False:
sys.exit('Directory {0} does not exists!'.format(zip_target_path))
if zip_target_path.endswith(os.sep):
zip_target_path = zip_target_path[0:-1] # remove seperator
zip_path = zip_target_path + '.zip'
if os.path.exists(zip_path):
if check_yes_no('Zip file already exists. Do you want to replace? [y/n]') == False:
print 'Bye'
sys.exit()
zip_dir(zip_target_path)
Si vous avez des problèmes ou des améliorations, n'hésitez pas à nous le faire savoir.