在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,以便我可以对用户说'你的文件名中包含无效字符'?我在这个问题上看到了其他问题,我无法让它们发挥作用。
答案 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字符。