TZipFileでZip圧縮を試しています。
対象ファイル名が日本語の場合、Zipファイル内のファイル名が
文字化けしてしまいます。
(TZipFile.ZipDirectoryContents()を使用しました。)
対処方法がありましたら、教えて頂けますでしょうか。
よろしくお願い致します。
当方では化けませんね...
圧縮/解凍ツールが UTF-8 に対応していないのではないでしょうか?
まずは LHAZ とかで試してみてはいかがでしょうか?
[LHAZ]
http://chitora.com/lhaz.html
アーカイバを変更できない場合ですが...
本来なら 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 を。
CodePage 437で決め打ちになっているのではなく、
それが歴史的な理由により唯一の文字コードとなっています。
SJISなどで作られたものはいわば独自拡張でZIPの仕様には入っていません。
> CodePage 437で決め打ちになっているのではなく、
> それが歴史的な理由により唯一の文字コードとなっています。
> SJISなどで作られたものはいわば独自拡張でZIPの仕様には入っていません。
この質問の趣旨は "文字化けをどうにかしたい" という事であり、
歴史的経緯がどうとかいう話ではないと思います。
それと、"歴史的経緯" の話は PKZip のヘッダに書かれてる事だと思うのですが、
UTF-8 が正式にサポートされたのは 2007 年の事です。
それ以前で日本語フォルダ/ファイル名を扱えるアーカイバはすべて独自拡張であるから、
これらのソフトウェアが生成した ZIP はすべて無視してもいいのですね?
# Windows 7 以前の "OS が持つ ZIP 機能" も CP932 (Shift_JIS) な独自拡張ですよ。
"UTF8Support = False" の場合のデフォルトコードページは CP437 で異論はないのですが、
"Microsoft が作った ZIP すら処理できない" というのも考え物だと思いませんか?
実装側が必ずしも仕様に従う必要はないので、
OSが持つZIP機能が独自拡張であることとは何の関係もないのでは。
要はDelphiの実装は仕様通りになっているのであって、
バグとして扱うこと自体が間違いだということです。
> この質問の趣旨は "文字化けをどうにかしたい" という事であり、
ということであれば、Voteしろというのも直接的な解決ではありませんよね。
それどころか内容を見る限りではVote以前の状態で止まっていますし。
> バグとして扱うこと自体が間違いだということです。
バグだとは一言も言ってないでしょう?QC 投稿者は僕じゃないですよ?
多分話が噛み合わないとは思いますが...、
例えば日本語フォルダ/ファイル名の ZIP を現状のまま圧縮したとしますね。
UTF-8 になりますよね?これを XP やら Vista に持っていったら
「文字化けしてる!」と言われちゃいますね。
で、これに対応するには "CodePage 437 決め打ち" をどうにかして、
Shift_JIS でも保存できるようにするしかありませんよね?
逆もしかりで、Shift_JIS な Zip ファイルを処理できないのなら、
とても面倒な事になりますよね?
TZipFile にコードページ指定があれば、世の中の大抵の ZIP ファイルは処理できます。
QC の内容が不当だとは思いません。現実に即した QC だと思います。
> Voteしろというのも直接的な解決ではありませんよね。
では、あなたならどうやって解決しますか?
System.Zip を改変して Shift_JIS な ZIP を扱えるようにする方法を提示しておきます。
[System.Zip.TZipFile を改変して Shift_JIS な Zip ファイルを扱えるようにする (XE2 以降)]
http://ht-deko.minim.ne.jp/ft1211.html#121117
>本来なら 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);
でいいだろ?
更新してたのか・・・
DEKO様、PK様、KHE00221様
ご返信ありがとうございました。
素のSystem.Zipでは、文字化けを回避できないことが理解できました。
また、DEKO様のご丁寧な実現方法の解説は、初心者の私にもわかり易く、
大変感謝しております。
必ずVoteします。
どうもありがとうございました。
ツイート | ![]() |