8

BOM を含む場合と含まない場合があるxmlデータがあります。byte[] byteArrayBOMをC#から削除する標準的な方法はありますか? そうでない場合、すべてのタイプのエンコーディングを含むすべてのケースを処理し、同じことを行う最良の方法は何ですか?

実際、コードのバグを修正していて、コードの多くを変更したくありません。誰かが BOM を削除するコードを教えてくれると助かります。

「<」のASCII値を見つけて、その前のバイトを無視することができることは知っています60が、それはしたくありません。

4

5 に答える 5

10

すべてのC#XMLパーサーがBOMを自動的に処理します。XDocumentを使用することをお勧めします-私の意見では、XDocumentはXMLデータの最もクリーンな抽象化を提供します。

例としてXDocumentを使用する:

using (var stream = new memoryStream(bytes))
{
  var document = XDocument.Load(stream);
  ...
}

XDocumentを入手したら、それを使用してBOMなしでバイトを省略することができます。

using (var stream = new MemoryStream())
using (var writer = XmlWriter.Create(stream))
{
  writer.Settings.Encoding = new UTF8Encoding(false);
  document.WriteTo(writer);
  var bytesWithoutBOM = stream.ToArray();
}
于 2013-03-18T11:53:12.370 に答える
2

BOM について心配する必要はありません。

何らかの理由で XmlDocument オブジェクトを使用する必要がある場合は、次のコードが役立ちます。

byte[] file_content = {wherever you get it};
XmlDocument xml = new XmlDocument();
xml.Load(new MemoryStream(file_content));

Google Api を使用して gmail アカウントから xml 添付ファイルをダウンロードしようとしたときに、ファイルに BOM があり、Encoding.UTF8.GetString(file_content) を使用しても「適切に」機能しませんでした。

于 2019-02-17T01:52:44.880 に答える
0

バイト配列の先頭にあるバイト順マークを識別する必要があります。http://www.unicode.org/faq/utf_bom.html#bom1で説明されているように、いくつかの異なる組み合わせがあります。

バイト配列の先頭から始まり、それらのシーケンスを探す小さなステートマシンを作成するだけです。

配列がどのように使用されているか、または配列で使用されている他のパラメーターがわからないため、シーケンスを「削除」する方法を実際に言うことはできません。オプションは次のように見えます:

  1. パラメータがある場合はstartcountそれらを変更して、配列の開始点(BOMを超えて)を反映することができます。
  2. count(配列のプロパティ以外の)パラメーターがある場合は、配列Length内のデータを移動してBOMを上書きし、countそれに応じて調整できます。
  3. startまたはパラメータがない場合countは、古い配列からBOMを引いたサイズの新しい配列を作成し、データを新しい配列にコピーする必要があります。

シーケンスを「削除」するには、マークが存在するかどうかを識別してから、残りのバイトを新しいバイト配列にコピーすることをお勧めします。Lengthまたは、(配列のプロパティ以外の)文字数を維持している場合

于 2013-03-18T13:13:38.213 に答える