zip ファイルは最近の仕様では UTF-8 でファイル名を格納できるのですが、多くの場合レガシーな環境依存文字コードでファイル名が格納された形式が使われています。日本語の場合は Windows に合わせて Shift-JIS (cp932) が使われることが多いです。 Python 2 では zipfile モジュールが返すファイル名はバイト文字列だったのでそのまま cp932 のファイル名が返ってきたのですが、 Python 3 では文字列が Unicode に統一されたため、 zip ファイルを読み込むとファイル名がデコードされて文字列になって返ってきます。 が、もちろん日本語の慣習がデフォルトの挙動になってるわけではないので、このままでは文字化けしてしまいます。 Python 3.4 の zipfile モジュールを読むと次のようになっていました。 if flags & 0x800