XML声明是否需要使用特定的编码?

问题描述:

我正在仔细研究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库一起处理。您继承的代码只是由尚未学会正确完成工作的人员编写的。我认为它可以被一个共同的图书馆取代。 –

XML解析器使用各种技术来发现文件的编码。它可能会在开始时查找字节顺序标记,它可能会在起始字节中查找可识别的模式(例如,EBCDIC中的"<?xml"是什么?),并且可能会假定起始字节是ASCII,在这种情况下它可以读取XML声明中的编码属性。其中一些内容由规范规定,其他规则则由实现定义。

如果其中两种技术给出不同的答案,例如,如果文件实际上是UTF-16,但是XML声明表示它是UTF-8,那么在技术上并不会使XML格式错误,但这确实意味着解析器可能无法制作它的头部或尾部。

试图通过插入零字节手动生成UTF-16看起来像一个非常糟糕的主意。