我对weihstephen服务器实现进行了重复检查,并且正在解决商业测试客户端的问题。我想知道我的xml文档声明是否需要采用特定的编码。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
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声明只是在声明指定的编码中。
答案 0 :(得分:3)
XML解析器使用各种技术来发现文件的编码。它可能在开始时寻找字节顺序标记,它可能在初始字节中寻找可识别的模式(例如,"<?xml"
在EBCDIC中看起来是什么样的?)并且它可以假设初始字节是ASCII中的在哪种情况下,它可以读取XML声明中的encoding属性。其中一些是由规范规定的,其他的则是实现定义的。
如果其中两种技术给出不同的答案,例如如果该文件实际上是UTF-16,但XML声明称它是UTF-8,那从技术上讲,它不会使XML格式错误,但它确实意味着解析器可能无法生成它的头部或尾部。
尝试通过插入零字节手动生成UTF-16看起来真的很糟糕。