2011-09-13 8 views
1

どの言語でもエクスポートできる必要があるデータのエクスポート作業を進めています。厳密にASCII文字を使用するすべての言語はうまくいきますが、東洋言語でデータをエクスポートすると、次の例外がスローされます。「無効な文字がメールヘッダーに見つかりました」少しの調査で、 「RFC 2184で指定されているように符号化されなければならない」という文字列のRFC 2183仕様によるものです。.Net MVC 2、ファイル名にASCII以外の文字が含まれているファイルを返します。

私はこれらの文書を読んでいませんでした多くの助けがありません。私は、ファイルを見つけるためにUTF-8エンコーディングでデータを送信する必要があることを理解しています。ただし、これにより、ダウンロードしたファイル名がエンコードされたUTF-8として表示されます。今のところ、私はファイル名をUTFにエンコーディングしています。 (このすべてはMVC2、C#である)

private static string GetCleanedFileName(string s) 
    { 
     char[] chars = s.ToCharArray(); 
     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < chars.Length; i++) 
     { 
      string encodedString = EncodeChar(chars[i]); 
      sb.Append(encodedString); 
     } 
     return sb.ToString(); 
    } 

    private static string EncodeChar(char chr) 
    { 
     UTF8Encoding encoding = new UTF8Encoding(); 
     StringBuilder sb = new StringBuilder(); 
     byte[] bytes = encoding.GetBytes(chr.ToString()); 

     for (int index = 0; index < bytes.Length; index++) 
     { 
      sb.AppendFormat("%{0}", Convert.ToString(bytes[index], 16)); 
     } 
     return sb.ToString(); 
    } 

、ファイルは次の関数に返されます。

[ActionName("FileLoad")] 
    public ActionResult FileLoad() 
    { 
     string fileName = Request["fileName"]; 

     //Code that contains the path and file type Removed as it doesn't really apply to the question 

     FileStream fs = new FileStream(filePath, FileMode.Open); 
     return File(fs, exportName, GetCleanedFileName(fileName)); 
    } 

厳密に言えば、これは動作します。ただし、ファイル名全体がUTFエンコードされてユーザーに届きます。私は非ASCII文字を保持できるように、既存のファイルをユーザーに返す方法を探しています。

何か助けていただければ幸いです。

答えて

0

これはUTF-8エンコーディングではなく、utf-8ベースのURIエンコーディングの変形です。あなたはそれがここに特別なだけでなく、%とみなし、他の文字をキャッチする必要があります

private static string GetCleanedFileName(string s) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach(byte b in Encoding.UTF8.GetBytes(s)) 
    { 
    if(b < 128 && b != 0x25)// ascii and not % 
     sb.Append((char)b); 
    else 
     sb.Append('%').Append(b.ToString("X2")); 
    } 
    return sb.ToString(); 
} 

:私たちは、でそれを修正することができます。これらの特殊文字がURIに特化した特殊文字と同じ場合は、Uri.EscapeDataString(s)を使用できます。

関連する問題