ZipFileによるZip圧縮時の日本語ファイル名文字化け対処方法

解決


  2012-11-16 20:02:23  No: 43389

TZipFileでZip圧縮を試しています。
対象ファイル名が日本語の場合、Zipファイル内のファイル名が
文字化けしてしまいます。
(TZipFile.ZipDirectoryContents()を使用しました。)

対処方法がありましたら、教えて頂けますでしょうか。
よろしくお願い致します。


DEKO  2012-11-16 20:50:02  No: 43390

当方では化けませんね...

圧縮/解凍ツールが UTF-8 に対応していないのではないでしょうか?
まずは LHAZ とかで試してみてはいかがでしょうか?

[LHAZ]
http://chitora.com/lhaz.html


DEKO  2012-11-16 22:04:12  No: 43391

アーカイバを変更できない場合ですが...

本来なら ZipDirectoryContents() をパクって UTF8Support = False を仕込めばいいのでしょうが、
System.Zip を見ると UTF-8 以外は CodePage 437 で決め打ちになっているためそれができません。

Report No: 104695            Status: Need Feedback
There are some bugs in System.ZIP
http://qc.embarcadero.com/wc/qcmain.aspx?d=104695
QCWIN:Defect_No=104695

# 是非 Vote を。


PK  2012-11-16 23:34:34  No: 43392

CodePage 437で決め打ちになっているのではなく、
それが歴史的な理由により唯一の文字コードとなっています。
SJISなどで作られたものはいわば独自拡張でZIPの仕様には入っていません。


DEKO  2012-11-17 01:31:58  No: 43393

> CodePage 437で決め打ちになっているのではなく、
> それが歴史的な理由により唯一の文字コードとなっています。
> SJISなどで作られたものはいわば独自拡張でZIPの仕様には入っていません。

この質問の趣旨は "文字化けをどうにかしたい" という事であり、
歴史的経緯がどうとかいう話ではないと思います。

それと、"歴史的経緯" の話は PKZip のヘッダに書かれてる事だと思うのですが、
UTF-8 が正式にサポートされたのは 2007 年の事です。

それ以前で日本語フォルダ/ファイル名を扱えるアーカイバはすべて独自拡張であるから、
これらのソフトウェアが生成した ZIP はすべて無視してもいいのですね?

# Windows 7 以前の "OS が持つ ZIP 機能" も CP932 (Shift_JIS) な独自拡張ですよ。

"UTF8Support = False" の場合のデフォルトコードページは CP437 で異論はないのですが、
"Microsoft が作った ZIP すら処理できない" というのも考え物だと思いませんか?


PK  2012-11-17 01:51:42  No: 43394

実装側が必ずしも仕様に従う必要はないので、
OSが持つZIP機能が独自拡張であることとは何の関係もないのでは。
要はDelphiの実装は仕様通りになっているのであって、
バグとして扱うこと自体が間違いだということです。

> この質問の趣旨は "文字化けをどうにかしたい" という事であり、
ということであれば、Voteしろというのも直接的な解決ではありませんよね。
それどころか内容を見る限りではVote以前の状態で止まっていますし。


DEKO  2012-11-17 02:38:09  No: 43395

> バグとして扱うこと自体が間違いだということです。
バグだとは一言も言ってないでしょう?QC 投稿者は僕じゃないですよ?

多分話が噛み合わないとは思いますが...、

例えば日本語フォルダ/ファイル名の ZIP を現状のまま圧縮したとしますね。
UTF-8 になりますよね?これを XP やら Vista に持っていったら
「文字化けしてる!」と言われちゃいますね。

で、これに対応するには "CodePage 437 決め打ち" をどうにかして、
Shift_JIS でも保存できるようにするしかありませんよね?

逆もしかりで、Shift_JIS な Zip ファイルを処理できないのなら、
とても面倒な事になりますよね?

TZipFile にコードページ指定があれば、世の中の大抵の ZIP ファイルは処理できます。
QC の内容が不当だとは思いません。現実に即した QC だと思います。

> Voteしろというのも直接的な解決ではありませんよね。
では、あなたならどうやって解決しますか?


DEKO  2012-11-18 03:43:33  No: 43396

System.Zip を改変して Shift_JIS な ZIP を扱えるようにする方法を提示しておきます。

[System.Zip.TZipFile を改変して Shift_JIS な Zip ファイルを扱えるようにする (XE2 以降)]
http://ht-deko.minim.ne.jp/ft1211.html#121117


KHE00221  2012-11-18 07:25:19  No: 43397

>本来なら ZipDirectoryContents() をパクって UTF8Support = False を仕込めばいいのでしょうが、
>System.Zip を見ると UTF-8 以外は CodePage 437 で決め打ちになっているためそれができません。

パクれるのなら System.zip コピーしてソース変えちゃえばいいだろ・・・

UTF8Support = False 仕込んで TOem437String を外すか
仕込まないで FUTF8Suppot の下変えちゃうか

    if FUTF8Support then
    begin
      //LHeader.Flag := LHeader.Flag or (1 SHL 11); // Language encoding flag, UTF8
      //LHeader.FileName := UTF8Encode(ArchiveFileName);
      LHeader.FileName := ArchiveFileName;
    end
    else
      LHeader.FileName := ArchiveFileName;
      //LHeader.FileName := TOem437String(ArchiveFileName);

      LHeader.FileNameLength := Length(LHeader.FileName);

でいいだろ?


KHE00221  2012-11-18 07:25:53  No: 43398

更新してたのか・・・


  2012-11-19 06:34:31  No: 43399

DEKO様、PK様、KHE00221様
ご返信ありがとうございました。

素のSystem.Zipでは、文字化けを回避できないことが理解できました。
また、DEKO様のご丁寧な実現方法の解説は、初心者の私にもわかり易く、
大変感謝しております。
必ずVoteします。

どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加