2017-10-11 65 views
2

我正在仔細研究weihstephen服務器實現,並解析了商業測試客戶端的問題。我想知道如果我的XML文檔聲明需要在一個特定的編碼。XML聲明是否需要使用特定的編碼?

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

奇怪的是以前的開發人員正在編寫的XML的TCP套接字與我假設他是針對一個Unicode/UTF-16編碼,但在生成代碼中的每個字符交織零它被設置爲UTF-8。

Transformer serializer = tf.newTransformer(); 
serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 

...

packetData[2 * i + 0] = data[i]; 
packetData[2 * i + 1] = 0; 

然後字節數組的分組數據被髮送:

dataOutputStream.write(packetData); 
dataOutputStream.flush(); 

所以在Wireshark的輸出文件看起來像這樣:

.<.?.x.m.l. .v.e.r.s.i.o.n.=.".1...0.". .e.n.c.o.d.i.n.g.=.".U.T.F.-.8.". .s.t.a.n.d.a.l.o.n.e.=.".n.o.".?.>

,我想知道上述是否有效,以及聲明是否需要以特定編碼表示UTF-8,其餘的xml文檔是由xml聲明指定的編碼還是xml聲明只是在編碼由聲明指定。

+1

UTF-16不僅僅是爲每個字符添加一個零。我認爲這只是該開發人員引入的一個錯誤。 – Alex

+0

我懷疑開發者有意將整個數據內容保存在16個字節中。 xml中可能有16位數據,並希望將整個數據內容保存爲一種格式。開發人員可能會加密並且對齊很重要,或者讓其他人破解解密並增加空間會使其難以破解。黑客會查找字符串?xml並且找不到它。 – jdweng

+0

無論文檔編碼如何,XML處理中的所有字符都來自Unicode字符集。除了少數幾個Unicode字符之外,任何不能處理的處理器都應該使其不符合規定的限制衆所周知。至於文檔編碼聲明和文件或流的實際編碼,XML庫一起處理。您繼承的代碼只是由尚未學會正確完成工作的人員編寫的。我認爲它可以被一個共同的圖書館取代。 –

回答

3

XML解析器使用各種技術來發現文件的編碼。它可能會在開始時查找字節順序標記,它可能會在起始字節中查找可識別的模式(例如,EBCDIC中的"<?xml"是什麼?),並且可能會假定起始字節是ASCII,在這種情況下它可以讀取XML聲明中的編碼屬性。其中一些內容由規範規定,其他規則則由實現定義。

如果其中兩種技術給出不同的答案,例如,如果文件實際上是UTF-16,但是XML聲明表示它是UTF-8,那麼在技術上並不會使XML格式錯誤,但這確實意味着解析器可能無法制作它的頭部或尾部。

試圖通過插入零字節手動生成UTF-16看起來像一個非常糟糕的主意。

相關問題