7

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

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私の間違いはどこにありますか?

4

3 に答える 3

2

Unicode(UTF-8はバイナリエンコーディングの1つです)は、他の8ビットエンコーディングよりも多くの文字を表すことができます。さらに、適切な変換を行っているのではなく、再解釈を行っています。これは、ファイル名のガベージを取得することを意味します。あなたは本当にUnicodeに関するJoelからの記事を読むべきです。

..。

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

于 2012-12-20T08:29:32.247 に答える
0

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

于 2012-12-24T10:13:05.933 に答える