2011-09-13 61 views
1

我正在處理需要能夠以任何語言導出的數據導出任務。所有使用嚴格ASCII字符的語言都可以正常工作,但是當我用東方語言進行數據導出時,它會拋出以下異常:「在郵件標題中找到無效字符」經過一番研究,我確定了這一點是由於RFC 2183規範,其中規定「參數值超過78個字符,或包含非ASCII字符,必須按[RFC 2184]」.Net MVC 2,return文件名中包含非ASCII字符的文件

中指定的編碼進行編碼我讀了這兩個文件,他們沒有沒什麼幫助。我知道有必要以UTF-8編碼發送數據以查找文件。但是,這會使下載的文件名稱顯示爲編碼的UTF-8。截至目前,我正在使用我將在下面發佈的函數將文件名編碼爲UTF文件。 (所有這一切都是在C#中,MVC2)

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)

相關問題