2017-10-11 8 views
2

私はweihstephenサーバーの実装を打ち破っています。商用テストクライアントの解析に問題があります。 XML文書の宣言を特定のエンコーディングにする必要があるかどうか疑問に思っています。XML宣言は特定のエンコーディングにする必要がありますか?

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

奇妙なことは、以前の開発者が、私は彼がUnicode/UTF-16エンコーディングでなく、生成コードに目指していますと仮定している各文字にゼロをインターリーブTCPソケットにXMLを書いています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ビットのデータがあり、データの内容全体を1つの形式で保持したいと考えていました。開発者が暗号化しようとする可能性があり、アライメントが重要だったり、誰かが解読をハックしたり、スペースを追加することでハッキングするのが難しくなったりします。ハッカーは文字列?xmlを探していて見つからないでしょう。 – jdweng

+0

ドキュメントのエンコードに関係なく、XML処理のすべての文字は、Unicode文字セットのものです。いくつかのUnicode文字を除くすべての文字は許可されているため、それを処理できないプロセッサであれば、その非準拠の制限をよく知らなければなりません。ドキュメントエンコーディング宣言とファイルまたはストリームの実際のエンコーディングに関して、XMLライブラリは両方を同時に処理します。あなたが継承したコードは、仕事を正しく行うための十分な知識をまだ持っていない人が書いたものです。私はそれが共通のライブラリに置き換えられると思うだろう。 –

答えて

3

XMLパーサーは、さまざまな手法を使用してファイルのエンコーディングを検出します。最初のバイトオーダーマークを探すかもし​​れません(例えば、"<?xml"はEBCDICのように見えるでしょうか?)、そして最初のバイトがASCIIであると仮定するかもしれません。 XML宣言のencoding属性を読み込みます。これらのものの中には、仕様で規定されているものもあれば、実装定義のまま残されているものもあります。

これらの技術のうちの2つが異なる答えを示す場合、ファイルが実際にUTF-16であるが、XML宣言がUTF-8であると言った場合、それは技術的にXMLを不正な形にするものではありませんが、パーサーがその頭や尾を作ることができない可能性があります。

ゼロバイトを挿入して手動でUTF-16を生成しようとすると、本当に悪い考えです。

関連する問題