2012-12-20 8 views
6

私のウェブサイトには、ユーザーがアップロードしたすべての画像をダウンロードするオプションがあります。問題は、ヘブライ名の画像です(ファイルの元の名前が必要です)。私はファイル名をデコードしようとしましたが、これは助けにはなりません。ここでは、コードは次のようになります。utf-8ファイル名のZipファイル

using ICSharpCode.SharpZipLib.Zip; 

Encoding iso = Encoding.GetEncoding("ISO-8859-1"); 
Encoding utf8 = Encoding.UTF8; 
byte[] utfBytes = utf8.GetBytes(file.Name); 
byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes); 
string name = iso.GetString(isoBytes); 

var entry = new ZipEntry(name + ".jpg"); 
zipStream.PutNextEntry(entry); 
using (var reader = new System.IO.FileStream(file.Name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
{ 
    byte[] buffer = new byte[ChunkSize]; 
    int bytesRead; 
    while ((bytesRead = reader.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     byte[] actual = new byte[bytesRead]; 
     Buffer.BlockCopy(buffer, 0, actual, 0, bytesRead); 
     zipStream.Write(actual, 0, actual.Length); 
    } 
} 

UTF-8エンコーディングした後、私はこのようなヘブライ語のファイル名を取得:?????? JPG どこに私のミスですか。?

+0

新しいZipEntryは何ですか?これは新しい 'System.IO.Compression'名前空間の一部であることに気づいていません。 j#? – efkah

+0

これはICSharpCode.SharpZipLib.Zipライブラリ –

答えて

1

のUnicode(UTF-8は、バイナリエンコーディングの一つである)は、他の8ビット符号化よりも多くの文字を表すことができます。さらに、あなたは適切な変換をしていませんが、再解釈は、あなたのファイル名にゴミが入ることを意味します。あなたは本当に記事をJoel on Unicodeから読むべきです。

...

今、あなたが記事を読んだことを、あなたはC#文字列のUnicodeデータを格納できることを知っている必要があり、あなたはおそらくfile.Nameの任意の変換を行う必要はありませんし、これを直接渡すことができますライブラリーにエンコーディング処理のバグがない場合(これは常に可能です)、コンストラクターはZipEntryになります。

+0

こんにちは。返信と記事をありがとう。エンコードブロックを実行しない場合、私はこのように私のzipファイル名を持っています:ëàüòòÇàîé_1.jpg –

0

C#で文字列がすでにユニコードなのであなたは、間違った変換を行っています。 アーカイブのファイル名を確認するためにどのツールを使用しますか? デフォルトでは、Windows ZIP実装はファイル名にシステムDOSエンコーディングを使用し、他の実装では他のエンコーディングを使用することができます。

関連する問題