2013-06-03 100 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文件併發送。 –

相關問題