如何测试文件名中的非ASCII字符

时间:2013-06-03 13:28:20

标签: c# asp.net

在asp.net网站上,用户尝试将文件上传为电子邮件附件,其中包含文件名中的emdash。将此作为电子邮件附件(交换服务器)发送时,文件已转换为_utf8_B_ * ** * .dat

因此,在.aspx页面上,我需要能够检测到作为Request.Files集合的一部分上载的文件的文件名中是否存在emdash。

string s = "a—b-";

byte[] arr = Encoding.ASCII.GetBytes(s);
foreach (byte element in arr)
{
   Response.Write(element.ToString() + ",");
}

上面的字符串有一个emdash作为第二个字符,一个普通的连字符作为第四个字符。

上面的代码将97,63,97,45打印到屏幕上。

我认为由于emdash不是有效的ASCII字符,因此会抛出错误或显示某些指示它不是有效的ASCII字符。但它返回63.

如何检测文件名中的emdash,以便我可以对用户说'你的文件名中包含无效字符'?我在这个问题上看到了其他问题,我无法让它们发挥作用。

2 个答案:

答案 0 :(得分:2)

  

如何检测文件名中的emdash,以便我可以对用户说'你的文件名中包含无效字符'?

这是错误的方法,因为明天用户将使用您的文件系统或其API不支持的另一个unicode字符上传文件。此外,您不需要ASCII,因为NTFS可以处理a lot more than 7 bytes per character

正确的问题是:“我可以使用哪些字符来保存文件”?但是,你将再次与文件系统实现联系在一起。您最好只generate a random filename并将文件写入该路径,并将文件名存储在数据库中,以便查看原始文件名。

如果您执行想要在用户提供的路径下保存文件,则必须从输入中删除Path.GetInvalidPathChars()Path.GetInvalidFileNameChars()

如果问题不是文件系统而是邮件系统,请显示相关代码和错误消息。

答案 1 :(得分:1)

这应该可以解决问题:

    foreach (char c in s) {
        if (c >= 128) {
            Response.Write("Non-ascii char detected: {0}", c);
        }
    }

我相信Encoding.ASCII.GetBytes首先转换为ASCII,因此在调用时不应该看到非ASCII字符。