6

さて、私はバイト配列を持っています。バイト配列内の xml serilized オブジェクトを知っていますが、そこからエンコーディングを取得する方法はありますか?

私はそれをデシリアライズするつもりはありませんが、SQLサーバーのxmlフィールドに保存しています...だから、文字列に変換する必要がありますか?

4

4 に答える 4

14

この質問に似た解決策は、バイト配列に対して Stream を使用することでこれを解決できます。そうすれば、バイトレベルでいじる必要はありません。このような:

Encoding encoding;
using (var stream = new MemoryStream(bytes))
{
    using (var xmlreader = new XmlTextReader(stream))
    {
        xmlreader.MoveToContent();
        encoding = xmlreader.Encoding;
    }
}
于 2009-03-12T10:56:13.713 に答える
7

最初の 40 バイト程度を確認できます1。それらには、エンコーディングを含む必要があるドキュメント宣言 (ドキュメント宣言があると仮定)が含まれている必要があります。または、UTF-8 または UTF-16 であると想定できます<?xml。(両方のパターンを確認してください。)

現実的に、UTF-8 または UTF-16 以外のものを取得できると思いますか? そうでない場合は、両方の開始時に取得するパターンを確認し、どちらのパターンにも従わない場合は例外をスローできます。または、別の試行を行う場合は、ドキュメントを UTF-8 としてデコードし、再エンコードして、同じバイトが返されるかどうかをいつでも確認できます。理想的ではありませんが、うまくいくかもしれません。

これを行うためのより厳密な方法があると確信していますが、それらは気難しいものになる可能性があります:)


1これよりもかなり少ない可能性があります。UTF-16 では 40 バイトである 20 文字で十分だと思います。

于 2009-02-24T11:05:01.003 に答える
7

最初の 2 または 3 バイトは、ストリームが UTF-8、Unicode-LittleEndian、または Unicode-BigEndian のいずれであるかを示すバイト オーダー マーク (BOM) である場合があります。

UTF-8 BOM は 0xEF 0xBB 0xBF Unicode-Bigendian は 0xFE 0xFF Unicode-LittleEndiaon は 0xFF 0xFE

これらのいずれも存在しない場合は、ASCII を使用してテストできます<?xml(最新の XML 生成のほとんどは、xml 宣言の前に空白を入れないという標準に準拠していることに注意してください)。

ASCII は最後まで使用される?>ため、encoding= の存在を見つけて、その値を見つけることができます。encoding が存在しないか、<?xmldeclare が存在しない場合は、UTF-8 と見なすことができます。

于 2009-02-24T11:08:51.070 に答える