.Net MVC 2,返回文件名中包含非ASCII字符的文件

时间:2011-09-13 14:00:12

标签: c# asp.net-mvc-2 download non-ascii-characters

我正在处理需要能够以任何语言导出的数据导出任务。所有使用严格ASCII字符的语言都可以正常工作,但是当我使用东方语言进行数据导出时,它会抛出以下异常:“在邮件头中找到了无效字符”通过一些研究,我确定这个是由于RFC 2183规范声明“参数值超过78个字符,或包含非ASCII字符,必须按照[RFC 2184]中的规定进行编码”

我阅读了这两份文件并没有多大帮助。我知道需要以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字符。

感谢任何帮助。

1 个答案:

答案 0 :(得分: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)