4

このコード

string xml = XmlHelper.ToXml(queryTemplate);

byte[] xmlb = StringHelper.GetBytes(xml);

var cd = new System.Net.Mime.ContentDisposition
{
    // for example foo.bak
    FileName = String.Format("{0}_v{1}.xml", queryModel.Name, queryModel.Version),

    // always prompt the user for downloading, set to true if you want
    // the browser to try to show the file inline
    Inline = false,
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(xmlb, "application/xml");

に変換した後、文字列のエンコーディングが正しくないことが判明しましたbyte[]

したがってstring、このようにすぐにファイルに入れる必要があります

FileStream xfile = new FileStream(Path.Combine(dldir, filename), FileMode.Create, System.IO.FileAccess.Write);
hssfwb.Write(xfile);

しかし、私はこれをしたくありません。ダウンロード後のファイルは必要ありません。ファイルのダウンロードとしてブラウザに返す必要があるだけで、後でファイルの削除に対処する必要はありません。これは、多くのリクエストがあるとかなり忙しくなる可能性があります。

からの文字エンコーディングを修正stringbyte[]、ブラウザに正しく返す方法は?

関数は次のGetBytesようになります

public static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}
4

3 に答える 3

14

次のようなものが機能します。

try
{
    Response.ContentType = "application/octet-stream"; 
    Response.AddHeader( "Content-Disposition", "attachment; filename=" + filename ); 
    Response.OutputStream.Write(xmlb, 0, xmlb.Length); 
    Response.Flush(); 
} 
catch(Exception ex) 
{
    // An error occurred.. 
}
于 2013-01-04T14:43:14.550 に答える
1

この場合:

public static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

char配列は内部的には UTF-16LE エンコーディングであるため、最終的には UTF-16LE エンコーディングになります。

System.Text.Encoding.Unicode.GetBytesすでに同じことを行っているため、誤解を招く可能性があり、すぐに使用できる機能の冗長な重複であるため、その関数を削除する必要があります。リトルエンディアンバイトオーダーを使用した UTF-16 形式のエンコーディング

エンコーディングを指定せずに一時ファイルを作成する場合は、Windows-1252 が必要になる可能性があります。これは、ファイルの作成時に暗黙的に使用されている可能性が高いためです。

Encoding enc = Encoding.GetEncoding(1252);
byte[] xmlb = enc.GetBytes(xml);

UTF-8 が必要な場合は、次のようにします。

byte[] xmlb = Encoding.UTF8.GetBytes(xml);
于 2013-01-06T12:06:18.213 に答える
0

これに対する答えがありましたが、問題は文字エンコーディングであることがわかりました。

解決策のリンクは以下です

文字列を byte[] に変換するとゼロ文字が作成される

于 2013-01-06T13:01:02.180 に答える