2013-06-03 56 views
2

在asp.net网站上,用户试图上传文件作为电子邮件附件,其中包含文件名中的emdash。当发送此作为电子邮件附件(交换服务器)的文件中得到了转化为_utf8_B_ * ** * .DAT如何测试文件名中的非ASCII字符

所以,一个.aspx页面中,我需要能够如果检测emdash存在于作为Request.Files集合的一部分上载的文件的文件名中。

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

从http://www.asciitable.com/可以看出63是问号的值。当您调用ASCII.GetBytes时,它会强制将字符转换为ASCII,并在字符无法转换时使用问号。 – David

回答

1

这也许应该做的伎俩:

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

我相信Encoding.ASCII.GetBytes首先转换为ASCII,所以你永远不应该看到非ASCII字符,当你调用。

+0

[_“ASCII字符被限制为最低的128个Unicode字符,从U + 0000到U + 007F。 ”_](http://msdn.microsoft.com/zh-cn/library/system.text.encoding .ascii.aspx)。你的'if'条件永远不会是'true'。 – CodeCaster

+0

好抓。我用128更新了条件。顺便说一下,原来的测试(> 256)确实赶上了这个例子中的破折号。 – VeeTheSecond

+1

但它不会捕获*&^%\:和其他无效(取决于上下文)字符。像这样使用框架提供的方法。 – CodeCaster

2

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

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

正确的问题是:“我可以使用哪些字符来保存文件”?但是,你又会被绑定到文件系统实现上。您最好只是​​并将文件写入该路径,并将文件名存储在数据库中,以便您可以查看原始文件名。

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

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

+0

问题不在于文件系统。该文件保存在服务器上没关系。但是,当邮件服务器发送该文件时,它会将其转换为.dat。更改文件名以便emdash是一个正常的连字符,并且邮件服务器发送它很好。没有错误代码 - 它只是将文件转换为.dat文件并发送。 –

相关问题