我正在处理需要能够以任何语言导出的数据导出任务。所有使用严格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字符。
感谢任何帮助。
答案 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)
。