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

时间:2017-10-11 00:39:08

标签: java xml encoding utf-8 utf-16

我对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文档的其余部分将是xml声明指定的编码或者xml声明只是在声明指定的编码中。

1 个答案:

答案 0 :(得分:3)

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

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

尝试通过插入零字节手动生成UTF-16看起来真的很糟糕。