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


116

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


8
BOMが不要な場合、なぜGetPreamble()を作成するのですか?
Hans Passant

回答:


200

バイトオーダーマーク(BOM)を省略するには、ストリームでUTF8Encoding以外のインスタンスを使用する必要があります。System.Text.Encoding.UTF8を生成するように構成されている)。これを行うには、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、すべてのコンストラクタs」は、StreamWriterデフォルトの使用BOMなしのUTF-8エンコーディングによって以下は、同じようにうまく動作する必要がありますので。

' 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の場合は許可されないことに注意してください。


常に賢いとは限らない:たとえばMy.Computer.FileSystem.WriteAllText、エンコードが指定されていない場合はBOMを書き込みます。
beppe9000 2016年

My.Computer.FileSystem.WriteAllTextこの点で例外です、おそらくVBの後方互換性を推測していますか?File.WriteAllTextデフォルトはUFT8NoBOMです。
jnm2 2016

28

これを試して:

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

6

単にWriteAllTextからのメソッドを使用してくださいSystem.IO.File

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

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


My名前空間からのものはBOMを使用します
beppe9000

4

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

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


4

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

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

new StreamWriter(Stream)
new StreamWriter(String)
new StreamWriter(String, Boolean)

指定する必要がある場合はどうなりますleaveOpenか?
binki 2015年

その場合、@ binkiはデフォルトのエンコーディングをStreamWriter使用できません。あなたは指定する必要がありますnew UTF8Encoding(false, true)あなたのエンコーディングを指定できるようにするためleaveOpenとBOMを持っていません。
SDのJG、

3

ローマン・ニキティンは正しいと思います。コンストラクター引数の意味が反転します。FalseはBOMなしを意味し、TrueはBOMありを意味します。

ANSI以外の文字を含まないBOMのないファイルはANSIファイルとまったく同じであるため、ANSIエンコーディングが得られます。「こんにちは」の文字列にいくつかの特殊文字を入力すると、ANSIエンコーディングが非BOMに変更されます。


1

BOMなしのXMLエンコーディングUTF-8
私たちはXMLデータをEPAに提出する必要があり、私たちの入力を受け取るアプリケーションはBOMなしのUTF-8を必要とします。そうそう、プレーンUTF-8はすべての人に受け入れられるべきですが、EPAには受け入れられません。これを行うための答えは、上記のコメントにあります。ロマンニキティンありがとう。

以下は、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)を使用している場合は、「ANSIでエンコード」と報告されます。ほとんどのテキストエディターはBOM文字を頼りにしてUTF-8かどうかを判断していると思います。これを明確に確認する方法は、WinHex(www.winhex.com)などのバイナリツールを使用することです。前後の違いを探していたので、Microsoft WinDiffアプリケーションを使用しました。


-1

入力テキストにバイトオーダーマークが含まれている可能性があります。その場合は、書き込む前に削除する必要があります。


1
助けてください。書く前にそれを削除する方法。
Vijay Balkawade

@ user180326デフォルトのリーダーはすでにそれを除外していませんか?
binki 2015年

-1
Dim sWriter As IO.StreamWriter = New IO.StreamWriter(shareworklist & "\" & getfilename() & ".txt", False, Encoding.Default)

思い通りの結果が得られます。


1
私のPCでは、ANSIファイルが作成されます
Muflix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.