2012-07-26 121 views
3

當我在某些場合中對一個字符串(即一個xml文件)進行urlEncode時,它會在文件末尾添加%00字符。我想知道爲什麼會發生這種情況,如果可以防止(我總是可以擦除%00字符)。 xml文件是使用xmlwriter創建的。奇怪的是我使用相同的代碼來創建其他XML文件,編碼後它不會添加%00個字符。UrlEncode .net在字符串末尾添加%00個字符

例子:

<?xml version="1.0" encoding="iso-8859-1"?> 
<!DOCTYPE peticion > 
<peticion> 
    <nombre>Info hotel</nombre> 
    <agencia>HOTUSA</agencia> 
    <tipo>15</tipo> 
</peticion> 

編輯:創建XML這是我做的。

Dim xmlWriterSettings As New System.Xml.XmlWriterSettings 
     With xmlWriterSettings 
      .Encoding = Encoding.GetEncoding("iso-8859-1") 
      .OmitXmlDeclaration = False 
      .Indent = True 
     End With 

     Dim ms As New IO.MemoryStream 

     Using writer As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(ms, xmlWriterSettings) 
      With writer 
       .WriteDocType("peticion", Nothing, Nothing, Nothing) 
       .WriteStartElement("peticion") 
       .WriteElementString("nombre", "Info hotel") 
       .WriteElementString("agencia", "HOTUSA") 
       .WriteElementString("tipo", "15") 
       .WriteEndElement() 
      End With 
     End Using 

     Dim xml As String = Encoding.GetEncoding("iso-8859-1").GetString(ms.GetBuffer) 

Dim XmlEncoded As String = HttpUtility.UrlEncode(xml) 

XmlEncoded包含:

%3c%3fxml+version%3d%221.0%22+encoding%3d%22iso-8859-1%22%3f%3e%0d%0a%3c!DOCTYPE+peticion+%3e%0d% 
0a%3cpeticion%3e%0d%0a++%3cnombre%3eInfo+hotel%3c%2fnombre%3e%0d%0a++%3cagencia%3eHOTUSA%3c% 
2fagencia%3e%0d%0a++%3ctipo%3e15%3c%2ftipo%3e%0d%0a%3c%2fpeticion%3e%00%00%00%00%00%00%00%00%00% 
00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00% 
00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00% 
00%00%00%00%00%00%00%00%00%00%00%00%00%00 

,所有這些%00從何而來?

+0

請出示變量'XML的聲明'和創建其內容的代碼。 – Codo 2012-07-26 15:04:38

回答

4

MemoryStream.GetBuffer的言論提供相應的指導:

注意,緩衝區包含分配的字節,這可能是未使用的。例如,如果將字符串「test」寫入到MemoryStream對象中,則從GetBuffer返回的緩衝區的長度爲256,而不是4,未使用252個字節。要僅獲取緩衝區中的數據,請使用ToArray方法;但是,ToArray會在內存中創建數據的副本。

修改代碼如下所示:

Dim xml As String = Encoding.GetEncoding("iso-8859-1").GetString(ms.ToArray) 

事實上,在這種情況下,更好的選擇是使用StringBuilder

Dim sb As New StringBuilder 
Using writer As XmlWriter = XmlWriter.Create(sb, xmlWriterSettings) 
    ' ... 
End Using   

Dim xml as String = sb.ToString() 
+0

我更喜歡你的'StringBuilder'答案。但是,我很苦,所以沒有upvote。 :) – Sumo 2012-07-26 16:31:30

+0

測試這兩個解決方案,他們工作!謝謝。 – ShengLong 2012-07-27 14:40:33

1

我相信ms.GetBuffer包含比你想象的更多。 %00表示NULL,我的猜測是緩衝區末尾包含填充NULL。

而是做:

Using ms As New IO.MemoryStream 
    Dim writer As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(ms, xmlWriterSettings) 

    With writer 
     .WriteDocType("peticion", Nothing, Nothing, Nothing) 
     .WriteStartElement("peticion") 
     .WriteElementString("nombre", "Info hotel") 
     .WriteElementString("agencia", "HOTUSA") 
     .WriteElementString("tipo", "15") 
     .WriteEndElement() 
    End With 

    ms.Position = 0 
    Dim xml As String = ms.ReadToEnd() 
    Dim XmlEncoded As String = HttpUtility.UrlEncode(xml) 
End Using 

有關從MemoryStream得到一個字符串的詳細信息,請參閱this question

請參閱this documentation詳細說明緩衝區包含可能未使用的分配字節這一事實。

+0

我認爲@sumo是正確的。 MemoryStream的文檔解釋說MemoryStreams不一定可以調整大小,所以可能會有填充:「使用無符號字節數組創建的內存流提供了不可調整大小的數據流。使用字節數組時,既不能附加到也不會縮小流,儘管您可能可以根據傳入構造函數的參數修改現有內容。空的內存流可調整大小,並且可以寫入和讀取。「 – 2012-07-26 15:54:24

+0

感謝您的回答,相撲。您首先指出ms.GetBuffer中存在一些奇怪的東西。 – ShengLong 2012-07-27 14:52:53

相關問題