3

場合によっては、文字列 (つまり、xml ファイル) を urlEncode すると、ファイルの末尾に %00 文字が追加されます。なぜこれが起こるのか、そしてそれを防ぐことができるかどうかを知りたいです(いつでも %00 文字を消去できます)。xml ファイルは xmlwriter を使用して作成されました。奇妙なことは、同じコードを使用して他の xml ファイルを作成し、それらをエンコードした後に %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 はどこから来たのですか?

4

2 に答える 2

4

に関するコメントはMemoryStream.GetBuffer、適切なガイダンスを提供します。

バッファーには、未使用の可能性がある割り当てられたバイトが含まれていることに注意してください。たとえば、文字列 "test" が MemoryStream オブジェクトに書き込まれた場合、GetBuffer から返されるバッファーの長さは 4 ではなく 256 で、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()
于 2012-07-26T16:08:07.647 に答える