質問するログイン新規登録
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

2回答

924閲覧

Python ZIPファイル圧縮時に圧縮対象のファイルが展開時文字化けする。

ngh_orange

総合スコア17

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

1クリップ

投稿2025/07/16 13:50

編集2025/07/17 23:54

0

1

実現したいこと

サーバーで圧縮した日本語が含まれるPDFファイルをZIPにまとめ、正常にクライアントが解凍できるようにしたい。

発生している問題・分からないこと

PDFファイルをZIPにまとめる際、生成されたZIPファイルを解凍すると中身のPDFファイルの日本語が文字化けする(数字は正常)

エラーメッセージ

error

1エラーメッセージはありません。 2ツールには単体のPDFをダウンロードする機能もあるのですが、単体の方では問題なく日本語になっています。 3

該当のソースコード

Python

1def create_zip_with_logs(zip_path, file_paths, log_lines): 2 with zipfile.ZipFile(zip_path, 'w', compression=zipfile.ZIP_DEFLATED) as zipf: 3 # PDFファイルを追加 4 for file_path in file_paths: 5 arcname = os.path.basename(file_path) 6 print(f"[DEBUG] アーカイブ名: {arcname}") 7 8 zip_info = zipfile.ZipInfo(arcname) 9 zip_info.compress_type = zipfile.ZIP_DEFLATED 10 11 # ファイルのタイムスタンプを設定 12 stat = os.stat(file_path) 13 zip_info.date_time = datetime.fromtimestamp(stat.st_mtime).timetuple()[:6] 14 15 with open(file_path, 'rb') as f: 16 zipf.writestr(zip_info, f.read())
特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ChatGPTやClaudeで投げてみても解決しませんでした。
文字コードの設定周りがかわりました。

補足

開発環境:Windows
本番環境:Ubuntu
クライアント:Windows GoogleChrome

文字化け環境
開発環境→Windows クライアント→Windows

zip_pathには作成したZIPファイルのパス
file_pathsには圧縮予定のファイル(今回はPDF)のパス
が代入されます。

###追加補足
ご回答、コメントの方ありがとうございます。
わかりづらかった部分があるかと思いますので追加で補足させていただきます。
文字化けするのはZipに圧縮したPDFの「ファイル名」です。
念の為圧縮前にprintでファイル名を確認しているのですがそこまではコンソールに日本語でちゃんと表示されます。
圧縮し、WindowsのChrome経由でダウンロードしたら文字化けしてしまう。
という形です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FKM

2025/07/17 06:41 編集

PDFじゃなくて、普通のテキストで試しても文字化けするなら間違いなく圧縮ツール側のエンコードの問題ですね。 そっちで検索したら山のように回答が出てきたとだけ言っておきます。
tabuu

2025/07/17 23:10

>中身のPDFファイルの日本語が文字化けする 文字化けするのはPDFファイルの中身ですか?ファイル名ですか?
katsuko

2025/07/17 23:38

> ツールには単体のPDFをダウンロードする機能もあるのですが、単体の方では問題なく日本語になっています。 これは、本当に **同じやり方** で確認していますか? 例えば、単体の方は(ブラウザからリンクを辿って)ブラウザの埋め込みビュアーで見ていて、zipの中身は(エクスプローラでダブルクリックで)AdobeReaderで見ている、なんてことはないですか。
bsdfan

2025/07/18 00:15

使っている python のバージョンと、展開につかっているツールについて記載してください。 python 3 の zipfile では、日本語ファイル名はUTF-8でエンコードされて、UTF-8のフラグがたった形で格納されているはずです。python 2 を使っていたり、Windows側で UTF-8 に対応していないツールを使っていないでしょうか?
hiroki-o

2025/07/19 10:06

以下の2環境、提示されたソースで、日本語ファイル名は文字化けしていません。 環境のバージョンを提示してください。 - Windows 11、Python 3.13.5、エクスプローラー標準の解凍機能 - Ubuntu 24.04.2 LTS、Python 3.12.3、UnZip 6.00
ngh_orange

2025/07/21 14:34

開発環境 print sys.version結果 3.12.3 | packaged by conda-forge | (main, Apr 15 2024, 18:20:11) [MSC v.1938 64 bit (AMD64)] Windows 10 展開ツール:Windows10標準搭載ツール 上記のような形になります。
hiroki-o

2025/07/21 15:58

conda-forgeのPythonは、標準と何か違うのでしょうか。>識者の皆さん 標準のPythonでは、提示されたソースは何の問題も無いです。 あと、Chromeでダウンロードする前に、サーバーのzipファイルを解凍すると文字化けしているのでしょうか?
FKM

2025/07/22 00:18

Anaconda(conda)のロケール設定に引きずられている可能性が高そうですね。Anaconda日本語版の標準ロケールは確かcp932のはずなので。
ngh_orange

2025/07/22 13:30

皆様ご回答ありがとうございます。 追加で試しましたので共有します。 試しにWinRARで解凍してみたところ、日本語が文字化けせずに表示できました。 ということはおそらく圧縮する際の文字コードだと思われるのですが、クライアント(Windows環境でのChromeやEdge)の解凍ソフトの環境をWindows標準エクスプローラーだと仮定した時、ZIPファイルの圧縮時に文字コード等は指定できますでしょうか?
FKM

2025/07/23 00:18

python zipfile エンコードで検索すれば探している情報が見つかるのではと思います https://qiita.com/methane/items/8493c10c19ca3584d31d みたいに 検索のコツは、一旦は環境を限定せずに汎用的に調べることですかね。
bsdfan

2025/07/23 01:43

CP437にからんだ回答やコメントがありますが、これはpythonのzipfileで「展開」するときの話なので、今回のケースでは関係ないです。 Ubuntuの本番環境で作られたzipファイルだと文字化けしていないんですよね? だとすると開発環境のpythonが原因と考えられますが、質問に書かれている部分だけでは、思いつく部分がありません。書かれていない部分が原因の可能性もあると思います。
guest

回答2

0

はい、この問題はZIPファイル内のファイル名(特に日本語を含む場合)のエンコーディングに関する非常によくある問題です。zipfileモジュールはデフォルトでファイル名にCP437という古い文字コードを使用しようとするため、日本語が文字化けします。 ●●●●

投稿2025/07/17 10:05

Janet729Shires

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

現在自分が実装しているシステムでも似たような現象が起きた過去があったので
実際に試してみましたが、やはりzipfileが正しくエンコード処理していないのが原因のようです。

py

1import zipfile 2 3#ファイル名は文字化けする 4with zipfile.ZipFile('zip_test.zip') as zipf: 5 for zinfo in zipf.infolist(): # ZipInfoオブジェクトを取得 6 #if not zinfo.flag_bits & 0x800: # flag_bitsプロパティで文字コードを取得 7 #zinfo.filename = zinfo.filename.encode('cp437').decode('cp932') 8 zipf.extract(zinfo, 'unzip') 9 10#ファイル名は文字化けしない 11with zipfile.ZipFile('zip_test.zip') as zipf: 12 for zinfo in zipf.infolist(): # ZipInfoオブジェクトを取得 13 if not zinfo.flag_bits & 0x800: # flag_bitsプロパティで文字コードを取得 14 zinfo.filename = zinfo.filename.encode('cp437').decode('cp932') 15 zipf.extract(zinfo, 'unzip')

コメントアウトしない状態だと文字化けされてファイル保存され、コメントアウトを外しエンコード処理を施した後ではきちんと日本語ファイル名で表示されます。
色々なページで現象の指摘がありましたが、一例として。
https://www.shibutan-bloomers.com/python_libraly_zip_shutil/1402/

ちなみに、この現象は圧縮でも展開でもzipfileのファイル名生成に関わる部分であるため、同様に起きました。

投稿2025/07/28 08:02

編集2025/07/28 08:05
FKM

総合スコア3668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroki-o

2025/07/28 09:41

ちなみに、実行環境は何ですか? - Windows 11、Python 3.13.5、エクスプローラー標準のzip機能 で確認しましたが、そのif文は通らないし、文字化けもしませんでした。 質問者さんが提示したソースで何の問題も無いですけど、確かにネット上には、その情報(CP437)が多いです。 謎ですね。
bsdfan

2025/07/28 12:51

> ちなみに、この現象は圧縮でも展開でもzipfileのファイル名生成に関わる部分であるため、同様に起きました。 興味があるので、ここについて追加で記載お願いします。(どういうコードで、どういうことをしたら、どういうことが起こったのか) zipfile のソースコードを見ると、圧縮時は ascii か utf-8 しか使われないと思うのですが。
FKM

2025/07/29 00:49 編集

この現象が発生したのは、そもそものPythonを動かす仮想環境Condaのロケール設定のせいじゃないかと思っています。自分が試した環境は、同じように仮想環境でWindows10、VirtualBox7、AlmaLinux9.2、Python12.3です。質問者のいうcondaとロケール含めた文字環境が似ていたので試してみたら案の定(開発環境で、pandasを使ってExcelをDLしようとしたらファイル名そのものが同じように文字化けした)だったというわけです。 他の方の指摘どおり、Windows11に特化して記事を検索してみましたが、確かにエンコード云々の指摘はないですね。
hiroki-o

2025/07/29 13:22

使ったことが無いので可能かどうか知りませんが、condaのロケールをShift_JISからUTF-8に変更したほうがよいと思います。 condaに合わせてソースを変えるなんて、本末転倒のような気がします。 いずれにしても、質問者さんの意見を聞きたいところだけど、もう解決したのかな?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問