System.Text.EncodingクラスとBOM(Byte Order Mark)のあり/なしの指定方法について。 またSystem.IO.StreamWriter内部の動作やEncodingを指定できるクラスとBOM出力の指定について。

§1 StreamWriterでのBOM出力

結論から述べると、StreamWriterがBOMを出力するかどうかは、StreamWriterコンストラクタの引数encodingに指定する値によって次のように変わる。

StreamWriterコンストラクタのencodingパラメータとBOMの出力
encodingパラメータ BOM
(指定なし) 出力しない
Encoding.UTF8 出力する
new UTF8Encoding(true) 出力する
new UTF8Encoding(false) 出力しない
StreamWriterコンストラクタに指定するencodingパラメータとBOM出力の違い
using System;
using System.IO;
using System.Text;

class Sample {
  static void Main()
  {
    const string text = "日本語";

    using (var stream = new MemoryStream()) {
      // encodingを指定しない場合
      using (var writer = new StreamWriter(stream)) {
        writer.Write(text);
      }
      Console.WriteLine(BitConverter.ToString(stream.ToArray()));
    }

    var encodings = new Encoding[] {
      Encoding.UTF8,
      new UTF8Encoding(true),
      new UTF8Encoding(false),
    };

    foreach (var encoding in encodings) {
      using (var stream = new MemoryStream()) {
        // encodingを指定した場合
        using (var writer = new StreamWriter(stream, encoding)) {
          writer.Write(text);
        }
        Console.WriteLine(BitConverter.ToString(stream.ToArray()));
      }
    }
  }
}
実行結果
E6-97-A5-E6-9C-AC-E8-AA-9E
EF-BB-BF-E6-97-A5-E6-9C-AC-E8-AA-9E
EF-BB-BF-E6-97-A5-E6-9C-AC-E8-AA-9E
E6-97-A5-E6-9C-AC-E8-AA-9E

(上記実行結果におけるEF-BB-BFのシーケンスがBOM)

UTF-8以外の場合も、以下のようにUTF8Encoding(またはEncoding.UTF8)を指定した場合と同様の動作となる。 BOM付きとなるかどうかで分類すると次のようになる。

StreamWriterコンストラクタのencodingパラメータとBOMの出力
エンコーディング BOM
あり なし
UTF-8 Encoding.UTF8
new UTF8Encoding(true)
new UTF8Encoding(false)
UTF-16 Little Endian Encoding.Unicode
new UnicodeEncoding(false, true)
new UnicodeEncoding(false, false)
UTF-16 Big Endian Encoding.BigEndianUnicode
new UnicodeEncoding(true, true)
new UnicodeEncoding(true, false)
UTF-32 Little Endian Encoding.UTF32
new UTF32Encoding(false, true)
new UTF32Encoding(false, false)
UTF-32 Big Endian new UTF32Encoding(true, true) new UTF32Encoding(true, false)

§1.1 StreamWriterでBOMが書き込まれる条件

MSDNでは、.NET Framework 3.5までStreamWriterコンストラクタの説明で以下のように記述されていた。 (.NET Framework 4.0以降のStreamWriterコンストラクタの説明では記載されていない。)

Encoding.Default 以外を指定した場合、バイト順マーク (BOM) がファイルに書き込まれます。

StreamWriter コンストラクタ (Stream, Encoding)

これを見ると、Encoding.Default以外(例えばEncoding.UTF8)を指定するとBOMが書き込まれるように読み取れる。

StreamWriterにEncoding.Default以外を指定した場合のBOMの出力
using System;
using System.IO;
using System.Text;

class Sample {
  static void Main()
  {
    var text = "日本語";

    using (var stream = new MemoryStream()) {
      // Encodingを指定しない
      using (var writer = new StreamWriter(stream)) {
        writer.Write(text);
      }
      Console.WriteLine(BitConverter.ToString(stream.ToArray()));
    }

    using (var stream = new MemoryStream()) {
      // Encoding.UTF8を指定する
      using (var writer = new StreamWriter(stream, Encoding.UTF8)) {
        writer.Write(text);
      }
      Console.WriteLine(BitConverter.ToString(stream.ToArray()));
    }
  }
}
実行結果
E6-97-A5-E6-9C-AC-E8-AA-9E
EF-BB-BF-E6-97-A5-E6-9C-AC-E8-AA-9E

しかし実際には、次の例のようにEncoding.Default以外を指定しても、コンストラクタでencoderShouldEmitUTF8Identifierにfalseを指定したUTF8Encodingの場合はBOMが書き込まれない。

encoderShouldEmitUTF8Identifierに指定する値によるStreamWriterのBOM出力の違い
using System;
using System.IO;
using System.Text;

class Sample {
  static void Main()
  {
    var text = "日本語";

    using (var stream = new MemoryStream()) {
      // encoderShouldEmitUTF8Identifierがfalseの(BOMを出力しない)UTF8Encodingを指定する
      using (var writer = new StreamWriter(stream, new UTF8Encoding(false))) {
        writer.Write(text);
      }
      Console.WriteLine(BitConverter.ToString(stream.ToArray()));
    }

    using (var stream = new MemoryStream()) {
      // encoderShouldEmitUTF8Identifierがtrueの(BOMを出力する)UTF8Encodingを指定する
      using (var writer = new StreamWriter(stream, new UTF8Encoding(true))) {
        writer.Write(text);
      }
      Console.WriteLine(BitConverter.ToString(stream.ToArray()));
    }
  }
}
実行結果
E6-97-A5-E6-9C-AC-E8-AA-9E
EF-BB-BF-E6-97-A5-E6-9C-AC-E8-AA-9E

§1.2 Encoding.GetPreambleとBOM、StreamWriter内部の動作

このようにStreamWriterでBOMが書き込まれるかどうかは、UTF8Encoding(およびUnicodeEncoding、UTF32Encoding)のコンストラクタに指定する値によって決まる。

より具体的には、StreamWriterがどのようなBOMを出力するかはEncoding.GetPreambleメソッドが返す値次第となる。 このメソッドは、エンコーディングに対応するBOMのバイト列を返す。 encoderShouldEmitUTF8Identifierにfalseになっていれば、このメソッドは空のバイト列を返す。 StreamWriterは、ストリームへ書き込む前にまずEncoding.GetPreambleメソッドを呼び出してBOMを取得し、その内容をストリームへ書き込む。 このとき、BOMを出力しないEncodingではEncoding.GetPreambleメソッドは空のバイト列を返すため、当然ストリームにもBOMは書き込まれない。

StreamWriter クラスも Encoding::GetPreamble() メソッドを呼び出し、テキスト ファイルの先頭にこのバイト列を書き込みます。これは優れた機能です。ユーザーがテキスト ファイルのエンコード方式をはっきり特定できるからです。ただし、弊社の多くの開発者は C 言語の知識を持っているため、テキスト ファイルの先頭に UTF-8 の Unicode BOM があると混乱してしまいました。また、Unicode に対応していないエディタ (vi、以前のバージョンの Emacs など) では扱いにくいこともあります。このため、StreamWriter クラスで既定で使用される UTF8Encoding では、GetPreamble メソッドから空のバイト列が返されます。UTF-8 ファイルに Unicode BOM を書き込むには、コード内で Encoding.UTF8 を明示的に指定します。

.NET Framework Developer Center:System.System.IO に関する FAQ - テキスト ファイルのエンコード方式を調べる方法はありますか。

この動作はUTF8Encoding以外のクラスでも同様なので、EncodingがBOMを出力するかどうかを事前に知りたい場合はEncoding.GetPreambleメソッドが返す値を調べればよい。

EncodingがBOMを出力するかどうか調べる
using System;
using System.Text;

class Sample {
  static void Main()
  {
    var encodings = new[] {
      Encoding.UTF8,            // UTF-8 BOM
      new UTF8Encoding(true),   // UTF-8 BOM
      new UTF8Encoding(false),  // UTF-8 non-BOM
      Encoding.Unicode,                   // UTF-16 Little Endian BOM
      new UnicodeEncoding(false, false),  // UTF-16 Little Endian non-BOM
      Encoding.GetEncoding("shift_jis"),
    };

    foreach (var encoding in encodings) {
      // encodingが出力するBOMを取得
      var preamble = encoding.GetPreamble();

      Console.WriteLine("{0} {1}",
                        encoding.WebName,
                        preamble.Length == 0 ? "non-BOM" : "BOM");
    }
  }
}
実行結果
utf-8 BOM
utf-8 BOM
utf-8 non-BOM
utf-16 BOM
utf-16 non-BOM
shift_jis non-BOM

§1.3 StreamWriter・BinaryWriterでのBOM出力

StreamWriterがBOMを出力するようにするには、Encoding.GetPreambleメソッドがBOMを返す(encoderShouldEmitUTF8Identifierにtrueを指定した)Encodingのインスタンスを渡す必要がある。

一方、BinaryWriterなどはEncoding.GetPreambleメソッドの戻り値に関わらずBOMを出力しない。 また、Encoding.GetBytesも常にBOMを含まないバイト列を返す。 そのため、BinaryWriterやEncoding.GetBytesでBOMを出力させたい場合は、別途Encoding.GetPreambleメソッドでBOMを取得して書き込むなどする必要がある。

次のサンプルでは、UTF8Encoding、UnicodeEncoding、UTF32Encodingの各コンストラクタにそれぞれ異なる値を指定して作成したインスタンスを使い、Encoding.GetPreambleメソッドが返す値と、Encoding.GetBytesが返す値、BinaryWriterおよびStreamWriterに書き込まれる内容を比較している。 (BinaryWriterは先頭に文字列のバイト長を書き込む点に注意)

各Encodingコンストラクタに指定する値とGetPreamble等のメソッドの動作、書き込まれる内容の違いを調べる
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

class UnicodePreamble {
  static void Main()
  {
    const bool bigEndian = true;
    const bool littleEndian = false;
    const bool bom = true;

    var unicodeEncodings = new Dictionary<string, Encoding>() {
      {"UTF-8",                     new UTF8Encoding(!bom)},
      {"UTF-8 (BOM)",               new UTF8Encoding( bom)},
      {"Encoding.UTF8",             Encoding.UTF8},
      {"UTF-16LE",                  new UnicodeEncoding(littleEndian, !bom)},
      {"UTF-16BE",                  new UnicodeEncoding(   bigEndian, !bom)},
      {"UTF-16LE (BOM)",            new UnicodeEncoding(littleEndian,  bom)},
      {"UTF-16BE (BOM)",            new UnicodeEncoding(   bigEndian,  bom)},
      {"Encoding.Unicode",          Encoding.Unicode},
      {"Encoding.BigEndianUnicode", Encoding.BigEndianUnicode},
      {"UTF-32LE",                  new UTF32Encoding(littleEndian, !bom)},
      {"UTF-32BE",                  new UTF32Encoding(   bigEndian, !bom)},
      {"UTF-32LE (BOM)",            new UTF32Encoding(littleEndian,  bom)},
      {"UTF-32BE (BOM)",            new UTF32Encoding(   bigEndian,  bom)},
      {"Encoding.UTF32",            Encoding.UTF32},
    };

    var text = "日本語";

    foreach (var pair in unicodeEncodings) {
      var encoding = pair.Value;

      Console.WriteLine(pair.Key);
      Console.WriteLine("  BOM: {0}", BitConverter.ToString(encoding.GetPreamble()));

      // StreamWriter
      using (var stream = new MemoryStream()) {
        using (var writer = new StreamWriter(stream, encoding)) {
          writer.Write(text);
        }
        Console.WriteLine("  StreamWriter     :    {0}", BitConverter.ToString(stream.ToArray()));
      }

      // Encoding.GetBytes
      Console.WriteLine("  Encoding.GetBytes:    {0}", BitConverter.ToString(encoding.GetBytes(text)));

      // BinaryWriter
      using (var stream = new MemoryStream()) {
        using (var writer = new BinaryWriter(stream, encoding)) {
          writer.Write(text);
        }
        Console.WriteLine("  BinaryWriter     : {0}", BitConverter.ToString(stream.ToArray()));
      }
    }
  }
}
実行結果
UTF-8
  BOM: 
  StreamWriter     :    E6-97-A5-E6-9C-AC-E8-AA-9E
  Encoding.GetBytes:    E6-97-A5-E6-9C-AC-E8-AA-9E
  BinaryWriter     : 09-E6-97-A5-E6-9C-AC-E8-AA-9E
UTF-8 (BOM)
  BOM: EF-BB-BF
  StreamWriter     :    EF-BB-BF-E6-97-A5-E6-9C-AC-E8-AA-9E
  Encoding.GetBytes:    E6-97-A5-E6-9C-AC-E8-AA-9E
  BinaryWriter     : 09-E6-97-A5-E6-9C-AC-E8-AA-9E
Encoding.UTF8
  BOM: EF-BB-BF
  StreamWriter     :    EF-BB-BF-E6-97-A5-E6-9C-AC-E8-AA-9E
  Encoding.GetBytes:    E6-97-A5-E6-9C-AC-E8-AA-9E
  BinaryWriter     : 09-E6-97-A5-E6-9C-AC-E8-AA-9E
UTF-16LE
  BOM: 
  StreamWriter     :    E5-65-2C-67-9E-8A
  Encoding.GetBytes:    E5-65-2C-67-9E-8A
  BinaryWriter     : 06-E5-65-2C-67-9E-8A
UTF-16BE
  BOM: 
  StreamWriter     :    65-E5-67-2C-8A-9E
  Encoding.GetBytes:    65-E5-67-2C-8A-9E
  BinaryWriter     : 06-65-E5-67-2C-8A-9E
UTF-16LE (BOM)
  BOM: FF-FE
  StreamWriter     :    FF-FE-E5-65-2C-67-9E-8A
  Encoding.GetBytes:    E5-65-2C-67-9E-8A
  BinaryWriter     : 06-E5-65-2C-67-9E-8A
UTF-16BE (BOM)
  BOM: FE-FF
  StreamWriter     :    FE-FF-65-E5-67-2C-8A-9E
  Encoding.GetBytes:    65-E5-67-2C-8A-9E
  BinaryWriter     : 06-65-E5-67-2C-8A-9E
Encoding.Unicode
  BOM: FF-FE
  StreamWriter     :    FF-FE-E5-65-2C-67-9E-8A
  Encoding.GetBytes:    E5-65-2C-67-9E-8A
  BinaryWriter     : 06-E5-65-2C-67-9E-8A
Encoding.BigEndianUnicode
  BOM: FE-FF
  StreamWriter     :    FE-FF-65-E5-67-2C-8A-9E
  Encoding.GetBytes:    65-E5-67-2C-8A-9E
  BinaryWriter     : 06-65-E5-67-2C-8A-9E
UTF-32LE
  BOM: 
  StreamWriter     :    E5-65-00-00-2C-67-00-00-9E-8A-00-00
  Encoding.GetBytes:    E5-65-00-00-2C-67-00-00-9E-8A-00-00
  BinaryWriter     : 0C-E5-65-00-00-2C-67-00-00-9E-8A-00-00
UTF-32BE
  BOM: 
  StreamWriter     :    00-00-65-E5-00-00-67-2C-00-00-8A-9E
  Encoding.GetBytes:    00-00-65-E5-00-00-67-2C-00-00-8A-9E
  BinaryWriter     : 0C-00-00-65-E5-00-00-67-2C-00-00-8A-9E
UTF-32LE (BOM)
  BOM: FF-FE-00-00
  StreamWriter     :    FF-FE-00-00-E5-65-00-00-2C-67-00-00-9E-8A-00-00
  Encoding.GetBytes:    E5-65-00-00-2C-67-00-00-9E-8A-00-00
  BinaryWriter     : 0C-E5-65-00-00-2C-67-00-00-9E-8A-00-00
UTF-32BE (BOM)
  BOM: 00-00-FE-FF
  StreamWriter     :    00-00-FE-FF-00-00-65-E5-00-00-67-2C-00-00-8A-9E
  Encoding.GetBytes:    00-00-65-E5-00-00-67-2C-00-00-8A-9E
  BinaryWriter     : 0C-00-00-65-E5-00-00-67-2C-00-00-8A-9E
Encoding.UTF32
  BOM: FF-FE-00-00
  StreamWriter     :    FF-FE-00-00-E5-65-00-00-2C-67-00-00-9E-8A-00-00
  Encoding.GetBytes:    E5-65-00-00-2C-67-00-00-9E-8A-00-00
  BinaryWriter     : 0C-E5-65-00-00-2C-67-00-00-9E-8A-00-00

§1.4 File.WriteAllTextでのBOM出力

File.WriteAllTextなど、テキストをファイルに書き込むFileクラスのメソッド使った場合についてもStreamWriterと同様の動作でBOMが出力される。

File.WriteAllTextメソッドに指定するEncodingとBOM出力の有無の違い
using System;
using System.IO;
using System.Text;

class Sample {
  static void Main()
  {
    const string text = "日本語";
    const string filename = "out.txt";

    // encodingを指定しない場合 (BOMは出力されない)
    File.WriteAllText(filename, text);

    Console.WriteLine(BitConverter.ToString(File.ReadAllBytes(filename)));

    var encodings = new Encoding[] {
      Encoding.UTF8,
      new UTF8Encoding(true),
      new UTF8Encoding(false),
    };

    foreach (var encoding in encodings) {
      // encodingを指定した場合 (encoderShouldEmitUTF8Identifier次第でBOMが出力される)
      File.WriteAllText(filename, text, encoding);

      Console.WriteLine(BitConverter.ToString(File.ReadAllBytes(filename)));
    }
  }
}
実行結果
E6-97-A5-E6-9C-AC-E8-AA-9E
EF-BB-BF-E6-97-A5-E6-9C-AC-E8-AA-9E
EF-BB-BF-E6-97-A5-E6-9C-AC-E8-AA-9E
E6-97-A5-E6-9C-AC-E8-AA-9E

§2 XML関連クラスでのBOM出力

§2.1 XmlWriter

XmlWriter.Createメソッドで作成したXmlWriterを使用する場合、BOMが出力されるかどうかはXmlWriterSettings.Encodingプロパティに設定するEncoding次第となる。

ただし、デフォルトではXmlWriterSettings.EncodingにEncoding.UTF8が設定されているため、特に指定しなかった場合はBOMが出力される。 従って、BOMを出力したくない場合には、BOMを出力しないEncodingをXmlWriterSettings.Encodingに指定する必要がある。

XmlWriterSettings.Encodingプロパティに指定するEncodingと、XmlWriterのBOM出力の有無の違い
using System;
using System.IO;
using System.Text;
using System.Xml;

class Sample {
  static void Main()
  {
    const string filename = "out.xml";

    var doc = new XmlDocument();

    doc.AppendChild(doc.CreateElement("要素"));

    var encodings = new Encoding[] {
      null,
      Encoding.UTF8,
      new UTF8Encoding(true),
      new UTF8Encoding(false),
    };

    foreach (var encoding in encodings) {
      var settings = new XmlWriterSettings();

      // XmlWriterSettings.Encodingの設定を変える
      // (nullの場合はデフォルトの設定をそのまま使用する)
      if (encoding != null)
        settings.Encoding = encoding;

      using (var writer = XmlWriter.Create(filename, settings)) {
        doc.Save(writer);
      }

      Console.WriteLine(File.ReadAllText(filename));
      Console.WriteLine(BitConverter.ToString(File.ReadAllBytes(filename)));
      Console.WriteLine();
    }
  }
}
実行結果
<?xml version="1.0" encoding="utf-8"?><要素 />
EF-BB-BF-3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-20-65-6E-63-6F-64-69-6E-67-3D-22-75-74-66-2D-38-22-3F-3E-3C-E8-A6-81-E7-B4-A0-20-2F-3E

<?xml version="1.0" encoding="utf-8"?><要素 />
EF-BB-BF-3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-20-65-6E-63-6F-64-69-6E-67-3D-22-75-74-66-2D-38-22-3F-3E-3C-E8-A6-81-E7-B4-A0-20-2F-3E

<?xml version="1.0" encoding="utf-8"?><要素 />
EF-BB-BF-3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-20-65-6E-63-6F-64-69-6E-67-3D-22-75-74-66-2D-38-22-3F-3E-3C-E8-A6-81-E7-B4-A0-20-2F-3E

<?xml version="1.0" encoding="utf-8"?><要素 />
3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-20-65-6E-63-6F-64-69-6E-67-3D-22-75-74-66-2D-38-22-3F-3E-3C-E8-A6-81-E7-B4-A0-20-2F-3E

XmlWriterSettingsによるXmlWriterの動作制御についてはXmlWriterSettingsを参照のこと。

§2.2 XmlDocument (System.Xml)

XmlWriterを使わずXmlDocument.SaveメソッドでXML文書を出力する場合は次のようになる。 XML宣言(XmlDeclaration)のencoding属性に"utf-8"などを指定した場合は、BOM付きのUTF-8で出力される。 一方nullstring.Emptyを指定した場合はBOMなしのUTF-8で出力されるが、encoding属性は省略される。 従って、BOMを出力せず、かつencoding属性付きのXML宣言を出力したい場合にはXmlWriterを使う必要がある。

XML宣言のencoding属性に指定する値と、XmlDocument.SaveメソッドのBOM出力の有無の違い
using System;
using System.IO;
using System.Xml;

class Sample {
  static void Main()
  {
    const string filename = "out.xml";

    var encodings = new string[] {
      "utf-8",
      null,
      string.Empty,
    };

    foreach (var encoding in encodings) {
      var doc = new XmlDocument();

      // encoding属性に指定する値を変えてXML宣言を作成・追加する
      doc.AppendChild(doc.CreateXmlDeclaration("1.0", encoding, null));

      doc.AppendChild(doc.CreateElement("要素"));

      doc.Save(filename);

      Console.WriteLine(File.ReadAllText(filename));
      Console.WriteLine(BitConverter.ToString(File.ReadAllBytes(filename)));
      Console.WriteLine();
    }
  }
}
実行結果
<?xml version="1.0" encoding="utf-8"?>
<要素 />
EF-BB-BF-3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-20-65-6E-63-6F-64-69-6E-67-3D-22-75-74-66-2D-38-22-3F-3E-0A-3C-E8-A6-81-E7-B4-A0-20-2F-3E

<?xml version="1.0"?>
<要素 />
3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-3F-3E-0A-3C-E8-A6-81-E7-B4-A0-20-2F-3E

<?xml version="1.0"?>
<要素 />
3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-3F-3E-0A-3C-E8-A6-81-E7-B4-A0-20-2F-3E

§2.3 XDocument (System.Xml.Linq)

XmlWriterを使わずXDocument.SaveメソッドでXML文書を出力する場合、XML宣言のencoding属性に"utf-8"などを指定した場合とnullstring.Emptyを指定した場合のどちらでもBOM付きのUTF-8で出力される。 従って、BOMを出力したくない場合には、BOMを出力しないEncodingを使用するXmlWriterを使う必要がある。

XML宣言のencoding属性に指定する値と、XDocument.SaveメソッドのBOM出力の有無の違い
using System;
using System.IO;
using System.Xml.Linq;

class Sample {
  static void Main()
  {
    const string filename = "out.xml";

    var encodings = new string[] {
      "utf-8",
      null,
      string.Empty,
    };

    foreach (var encoding in encodings) {
      var doc = new XDocument(
        new XDeclaration("1.0", encoding, null), // encoding属性に指定する値を変えてXML宣言を作成・追加する
        new XElement("要素")
      );

      doc.Save(filename);

      Console.WriteLine(File.ReadAllText(filename));
      Console.WriteLine(BitConverter.ToString(File.ReadAllBytes(filename)));
      Console.WriteLine();
    }
  }
}
実行結果
<?xml version="1.0" encoding="utf-8"?>
<要素 />
EF-BB-BF-3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-20-65-6E-63-6F-64-69-6E-67-3D-22-75-74-66-2D-38-22-3F-3E-0D-0A-3C-E8-A6-81-E7-B4-A0-20-2F-3E

<?xml version="1.0" encoding="utf-8"?>
<要素 />
EF-BB-BF-3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-20-65-6E-63-6F-64-69-6E-67-3D-22-75-74-66-2D-38-22-3F-3E-0D-0A-3C-E8-A6-81-E7-B4-A0-20-2F-3E

<?xml version="1.0" encoding="utf-8"?>
<要素 />
EF-BB-BF-3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-20-65-6E-63-6F-64-69-6E-67-3D-22-75-74-66-2D-38-22-3F-3E-0D-0A-3C-E8-A6-81-E7-B4-A0-20-2F-3E

XDocumentにおけるXML宣言についてはXMLの構築・出力 §.XML宣言 (XDeclaration)、Saveメソッドによる保存についてはXMLの構築・出力 §.Saveメソッドを用いた出力を参照のこと。