# >>> name = b'f\x94n' # >>> name.decode('sjis') # 'f馬' # >>> name.decode('cp437') # 'fön' class Encoding(object): def _decode_filename(self, bytes_filename, flags, default_encoding=None): encodings = [] if default_encoding: encodings.append(default_encoding) if flags & 0x800: # UTF-8 file names extension encodings.append('utf-8') # Japanese encoding encodings.extend(['iso-2022-jp', 'euc-jp', 'sjis']) # Historical ZIP filename encoding encodings.append('cp437') for encoding in encodings: try: filename = bytes_filename.decode(encoding) break except UnicodeDecodeError as raiz: if raiz.reason != 'illegal multibyte sequence': raise UnicodeDecodeError(*raiz.args) if self.debug: print('encoding: {}, filename: {}'.format(encoding, filename)) return filename if __name__ == '__main__': encoding = Encoding() encoding.debug = True name = b'f\x94n' sjis_filename = encoding._decode_filename(name, 0, 'sjis') cp437_filename = encoding._decode_filename(name, 0, 'cp437') print('sjis_filename =', sjis_filename) print('cp437_filename =', cp437_filename)