2011-01-27 20 views
2

我在一個Web應用程序 的字符串的字符串是這樣的:錯編碼由回覆於

`1234567890-=[]\ ;',./\[email protected]#$%^&*()_+{}|:"<>?| 

編碼後(通過使用Server.Encode())它顯示以下內容:

`1234567890-=[]\\ ;&#39;,./\\[email protected]#$%^&amp;*()_+{}|:&quot;&lt;&gt;?| 

這是正確的

然而,當我使用Response.Write(theSecondExample)結果是這樣的:

`1234567890-=[]\ ;&#39;,./\[email protected]#$%^&amp;*()_+{}|:&quot;&lt;&gt;?| 

反斜槓丟失了!

這怎麼可能是輸出不是我所期望的?我怎樣才能防止它?

+0

你可以發佈代碼示例嗎?看起來雙反斜槓被解釋爲反斜槓的轉義字符。 – Robaticus 2011-01-27 13:33:49

+0

什麼編碼?反斜槓不應該使用HTMLEncoding進行更改,因爲它是有效的HTML字符。請張貼相關的代碼。 – 2011-01-27 13:34:03

回答

5

沒有錯誤 - 您正在驗證調試器中的字符串,該字符串會自動轉義字符串 - 例如, "Hello \ Goodbye"將在調試器中顯示爲"Hello \\ Goodbye"

這就是說,調試器的工作不同,這取決於你如何看待一個字符串(也無論是當然的C#/ VB):

  • 將鼠標懸停在一個字符串(最常見),你會得到逃脫這是你應該做的實際驗證字符串 - 如果您選擇「文本」 Visualiser的,你會看到轉義版本版本的提示
  • 監視窗口/當地人還等逃脫顯示版本
  • 的Html Visualiser的不正是它在錫說:)

更新

好了,我已經走了一點,併發射了VS2010,請創建一個測試項目,按照它通過。

[TestMethod] 
public void TestMethod1() 
{ 
    string a = @"`1234567890-=[]\ ;',./\[email protected]#$%^&*()_+{}|:""<>?|"; 
    Console.WriteLine("Original:"); 
    Console.WriteLine("{0}", a); 
    string htmlEncoded = System.Web.HttpUtility.HtmlEncode(a); 
    Console.WriteLine("Html Encoded:"); 
    Console.WriteLine("{0}", htmlEncoded); 
} 

(顯然,我最初使用了一個逐字字符串,以避免除了雙引號之外的任何東西都要轉義)。

測試的控制檯輸出爲:

Original: 
`1234567890-=[]\ ;',./\[email protected]#$%^&*()_+{}|:"<>?| 
Html Encoded: 
`1234567890-=[]\ ;&#39;,./\[email protected]#$%^&amp;*()_+{}|:&quot;&lt;&gt;?| 

同樣,如果你斷點測試的結束和開始與visualisers瞎:

哈弗(a):

"`1234567890-=[]\\ ;',./\\[email protected]#$%^&*()_+{}|:\"<>?|" 

即它是C#在工具提示中轉義並被引號包圍。

懸停(htmlEncoded):

"`1234567890-=[]\\ ;&#39;,./\\[email protected]#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|" 

..再次,它的HTML編碼 C#逃脫引號

文本(htmlEncoded):

`1234567890-=[]\ ;&#39;,./\[email protected]#$%^&amp;*()_+{}|:&quot;&lt;&gt;?| 

。沒有C#逃逸

HTML(htmlEncoded):

`1234567890-=[]\ ;',./\[email protected]#$%^&*()_+{}|:"<>?| 

在Times New Roman腳本當然:)

我相信我們會回到原始字符串 - 這也表明您描述的場景不可能是這種情況 - 除非您已經將轉義字符串讀爲「正確」,而實際上它不是。 Html不需要\被轉義。