1. ホーム
  2. vb.net

[解決済み] BOM(バイトオーダーマーク)なしでテキストファイルを書き込むには?

2022-09-16 13:08:21

質問

VB.Netを使用して、BOMなしで、UTF8エンコーディングのテキストファイルを作成しようとしています。これを行う方法、誰か私を助けることができますか?

私はUTF8エンコーディングでファイルを書くことができますが、それからByte Order Markを削除する方法を教えてください。

edit1です。 このようなコードを試してみました。

    Dim utf8 As New UTF8Encoding()
    Dim utf8EmitBOM As New UTF8Encoding(True)
    Dim strW As New StreamWriter("c:\temp\bom\1.html", True, utf8EmitBOM)
    strW.Write(utf8EmitBOM.GetPreamble())
    strW.WriteLine("hi there")
    strW.Close()

        Dim strw2 As New StreamWriter("c:\temp\bom\2.html", True, utf8)
        strw2.Write(utf8.GetPreamble())
        strw2.WriteLine("hi there")
        strw2.Close()

1.htmlはUTF8エンコーディングのみ、2.htmlはANSIエンコーディングで作成されます。

簡易的な方法 http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html

どのように解決するのですか?

バイトオーダーマーク (BOM) を省略するためには、ストリームで UTF8Encoding 以外の System.Text.Encoding.UTF8 (BOMを生成するように設定されています)。これを行うには、2つの簡単な方法があります。

1. 適切なエンコーディングを明示的に指定する。

  1. を呼び出す。 UTF8Encoding コンストラクタ False には encoderShouldEmitUTF8Identifier パラメータを指定します。

  2. を渡す。 UTF8Encoding のインスタンスをストリームのコンストラクタに渡します。

' VB.NET:
Dim utf8WithoutBom As New System.Text.UTF8Encoding(False)
Using sink As New StreamWriter("Foobar.txt", False, utf8WithoutBom)
    sink.WriteLine("...")
End Using

// C#:
var utf8WithoutBom = new System.Text.UTF8Encoding(false);
using (var sink = new StreamWriter("Foobar.txt", false, utf8WithoutBom))
{
    sink.WriteLine("...");
}

2. デフォルトエンコーディングを使用する。

を指定しない場合は EncodingStreamWriter のコンストラクタに全く影響を与えません。 StreamWriter はデフォルトでBOMなしのUTF8エンコーディングを使うので、次のようにしてもうまくいくはずです。

' VB.NET:
Using sink As New StreamWriter("Foobar.txt")
    sink.WriteLine("...")
End Using

// C#:
using (var sink = new StreamWriter("Foobar.txt"))
{
    sink.WriteLine("...");
}

最後に、BOMを省略することはUTF-8に対してのみ許され、UTF-16に対しては許されないことに注意してください。