Differences
This shows you the differences between two versions of the page.
Previous revision | |||
— | appwiki:compression [2022/11/03 09:33] (current) – [Common Problem on compressed File and Solution] ying | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== File name encoding problem in File Compression Method ====== | ||
+ | |||
+ | * Problem: specially when cross-platform, | ||
+ | * Solution 1: using tar to compress | ||
+ | * Solution 2 in linux: unzip -O CP936 non_english_name.zip (means using GBK, GB18030 Chinese code) | ||
+ | * Solution 3 use Java: jar xvf non_english_name.zip | ||
+ | * ref: http:// | ||
+ | |||
+ | * Problem: when zip or winrar uncompress a non-english encoding archive file, sometimes require set system locale language and reboot to get name uncompressed right. | ||
+ | * Solution 1 (windows method): using already-to-use-build zip and unzip tool from DotNetZip library, which support encoding and decode option < | ||
+ | * download and it's under its tool folder: https:// | ||
+ | * ref: http:// | ||
+ | * windows code page: https:// | ||
+ | * 936 and 1386 for GBK | ||
+ | * 932 and 943 for shift JIS | ||
+ | * Solution 2 (cross platform) using Python (sometime works, sometimes error encoding): < | ||
+ | * here is the python code for xZip.py< | ||
+ | # full list of codec: https:// | ||
+ | # note: | ||
+ | # - input from command line is using commandline system default locale encoding | ||
+ | # - it read the zip file path in unicode format with the given decode method | ||
+ | # - if you use python print method to print those unicode path in window command windows, | ||
+ | # it may error when system default locale codec can't print those unicode characters | ||
+ | import zipfile | ||
+ | import os.path | ||
+ | import os | ||
+ | import sys | ||
+ | |||
+ | class ZFile(object): | ||
+ | def __init__(self, | ||
+ | self.filename = filename | ||
+ | self.mode = mode | ||
+ | if self.mode in (' | ||
+ | self.zfile = zipfile.ZipFile(filename, | ||
+ | else: | ||
+ | self.zfile = zipfile.ZipFile(filename, | ||
+ | self.basedir = basedir | ||
+ | if not self.basedir: | ||
+ | self.basedir = os.path.dirname(filename) | ||
+ | | ||
+ | def addfile(self, | ||
+ | path = path.replace('//', | ||
+ | if not arcname: | ||
+ | if path.startswith(self.basedir): | ||
+ | arcname = path[len(self.basedir): | ||
+ | else: | ||
+ | arcname = '' | ||
+ | self.zfile.write(path, | ||
+ | | ||
+ | def addfiles(self, | ||
+ | for path in paths: | ||
+ | if isinstance(path, | ||
+ | self.addfile(*path) | ||
+ | else: | ||
+ | self.addfile(path) | ||
+ | | ||
+ | def close(self): | ||
+ | self.zfile.close() | ||
+ | | ||
+ | def extract_to(self, | ||
+ | for p in self.zfile.namelist(): | ||
+ | self.extract(p, | ||
+ | | ||
+ | def extract(self, | ||
+ | if not filename.endswith('/' | ||
+ | f = os.path.join(path, | ||
+ | dir = os.path.dirname(f) | ||
+ | if not os.path.exists(dir): | ||
+ | os.makedirs(dir) | ||
+ | file(f, ' | ||
+ | | ||
+ | | ||
+ | def create(zfile, | ||
+ | z = ZFile(zfile, | ||
+ | z.addfiles(files) | ||
+ | z.close() | ||
+ | | ||
+ | def extract(zfile, | ||
+ | z = ZFile(zfile) | ||
+ | z.extract_to(path, | ||
+ | z.close() | ||
+ | |||
+ | if __name__==" | ||
+ | extract(unicode(sys.argv[1]), | ||
+ | </ | ||
+ | |||
+ | * Alternative solution: extract normally with wrong-encoding names, then fixing those name using python decode and encode | ||
+ | |||
+ | * Site Notes: | ||
+ | * in windows commands, chcp is used to change display page code (file name encoding) [[https:// | ||
+ | |||
+ | |||
+ | * additional reading: | ||
+ | * http:// | ||
+ | * http:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | ====== Common Problem on compressed File and Solution ====== | ||
+ | |||
+ | * Problem: Winrar has update the version recently, only winrar can't open some new winrar file. | ||
+ | * Solution: get latest 7z to uncompress it, will be fine. http:// | ||
+ | |||
+ | ====== Winrar ====== | ||
+ | |||
+ | * extract with cmd < | ||
+ | |||
+ | |||