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

Does XML declaration need to be in a specific encoding?

我正在对 weihstephen 服务器实施进行故障排除,并且在使用商业测试客户端时遇到解析问题。我想知道我的 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 文档的其余部分将是 [= 指定的编码33=] 声明或 xml 声明只是在声明指定的编码中。

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

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

尝试通过插入零字节手动生成 UTF-16 看起来真是个坏主意。