web-dev-qa-db-ja.com

バイトオーダーマーク(BOM)なしでテキストファイルを書き込みますか?

BOMなしで、UTF8エンコーディングでVB.Netを使用してテキストファイルを作成しようとしています。誰でも私を助けることができますか、これを行う方法は?
UTF8エンコーディングでファイルを書き込むことはできますが、バイト順マークを削除するにはどうすればよいですか?

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

114
Vijay Balkawade

バイトオーダーマーク(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。デフォルトのエンコーディングの使用:

EncodingのコンストラクターにStreamWriterをまったく指定しない場合、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では許可されないことに注意してください。

195
stakx

これを試して:

Encoding outputEnc = new UTF8Encoding(false); // create encoding with no BOM
TextWriter file = new StreamWriter(filePath, false, outputEnc); // open file with encoding
// write data here
file.Close(); // save and close it
28
Roman Nikitin

System.IO.FileWriteAllTextメソッドを使用するだけです。

File.WriteAllText のサンプルを確認してください。

このメソッドは、バイトオーダーマーク(BOM)なしのUTF-8エンコードを使用するため、GetPreambleメソッドを使用すると、空のバイト配列が返されます。ファイルの先頭にバイトオーダーマークなどのUTF-8識別子を含める必要がある場合は、UTF8エンコーディングでオーバーロードするWriteAllText(String、String、Encoding)メソッドを使用します。

6
Joe.wang

これに関する興味深いメモ:奇妙なことに、System.IO.Fileクラスの静的な "CreateText()"メソッドはUTF-8ファイルを作成しますwithout BOM。

一般的にこれはバグの原因ですが、あなたの場合、それは最も簡単な回避策かもしれません:)

4
Tao

新しい Encoding を作成するときにStreamWriterを指定しない場合、デフォルトのEncodingオブジェクトが使用されますnew UTF8Encoding(false, true)を介して作成される UTF-8 No BOM です。

したがって、エンコーディングを提供する必要のないコンストラクタをBOMで使用せずにテキストファイルを作成するには、次のようにします。

new StreamWriter(Stream)
new StreamWriter(String)
new StreamWriter(String, Boolean)
4
JG in SD

ローマのニキチンは正しいと思います。コンストラクター引数の意味は反転します。 FalseはBOMなしを意味し、trueはBOMを意味します。

ANSI以外の文字を含まないBOMのないファイルはANSIファイルとまったく同じであるため、ANSIエンコーディングを取得します。 「hi there」という文字列で特殊文字をいくつか試してみると、ANSIエンコーディングがwithout-BOMに変更されていることがわかります。

3
jos

BOMなしのUTF-8エンコードXML
XMLデータをEPAに送信する必要があり、入力を受け取るアプリケーションにはBOMなしのUTF-8が必要です。そうです、プレーンUTF-8はすべての人に受け入れられるべきですが、EPAには受け入れられません。これに対する答えは、上記のコメントにあります。ありがとうRoman Nikitin

XMLエンコードのコードのC#スニペットを次に示します。

    Encoding utf8noBOM = new UTF8Encoding(false);  
    XmlWriterSettings settings = new XmlWriterSettings();  
    settings.Encoding = utf8noBOM;  
        …  
    using (XmlWriter xw = XmlWriter.Create(filePath, settings))  
    {  
        xDoc.WriteTo(xw);  
        xw.Flush();  
    }    

これが実際に出力ファイルから3つの先行文字を削除するかどうかを確認することは、誤解を招く可能性があります。たとえば、Notepad ++(www.notepad-plus-plus.org)を使用すると、「Encode in ANSI」と報告されます。ほとんどのテキストエディタは、BOM文字がUTF-8であるかどうかを判断するために頼っています。これを明確に見るには、WinHex(www.winhex.com)のようなバイナリツールを使用します。前と後の違いを探していたので、Microsoft WinDiffアプリケーションを使用しました。

1
Jerry Banasik