BOM (Byte Order Mark)없이 텍스트 파일을 작성 하시겠습니까?


116

BOM없이 UTF8 인코딩으로 VB.Net을 사용하여 텍스트 파일을 만들려고합니다. 아무도 나를 도울 수 있습니까?
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


8
BOM을 원하지 않는 경우 GetPreamble ()을 작성하는 이유는 무엇입니까?
Hans Passant

답변:


200

바이트 순서 표시 (BOM)를 생략하려면 스트림 UTF8EncodingSystem.Text.Encoding.UTF8(BOM을 생성하도록 구성된) other 인스턴스를 사용해야합니다 . 이를 수행하는 두 가지 쉬운 방법이 있습니다.

1. 적절한 인코딩을 명시 적으로 지정 :

  1. 매개 변수에 대해 UTF8Encoding생성자 를 호출합니다 .FalseencoderShouldEmitUTF8Identifier

  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. 기본 인코딩 사용 :

Encodingto 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-16이 아닌 UTF-8에만 허용됩니다.


항상 현명한 것은 아닙니다. 예를 들어 My.Computer.FileSystem.WriteAllText인코딩이 지정되지 않은 경우 BOM을 작성합니다.
beppe9000 2016-06-04

My.Computer.FileSystem.WriteAllText이와 관련하여 예외이며 아마도 이전 버전의 VB 호환성을 추측합니까? File.WriteAllText기본값은 UFT8NoBOM입니다.
jnm2

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 (Byte-Order Mark)없이 UTF-8 인코딩을 사용하므로 GetPreamble 메서드를 사용하면 빈 바이트 배열이 반환됩니다. 파일 시작 부분에 바이트 순서 표시와 같은 UTF-8 식별자를 포함해야하는 경우 UTF8 인코딩으로 WriteAllText (String, String, Encoding) 메서드 오버로드를 사용합니다.


내 네임 스페이스 하나는 사용 BOM을 수행
beppe9000

4

이와 관련하여 흥미로운 점 : 이상하게도 System.IO.File 클래스의 정적 "CreateText ()"메서드는 BOM 없이 UTF-8 파일 생성합니다 .

일반적으로 이것은 버그의 원인이지만 귀하의 경우에는 가장 간단한 해결 방법 일 수 있습니다. :)


4

Encoding새로 생성 할 때를 지정하지 않으면를 통해 생성되는 StreamWriter기본 Encoding객체가 사용 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이 없습니다.
JG SD의

3

나는 Roman Nikitin이 옳다고 생각합니다. 생성자 인수의 의미가 뒤집 힙니다. False는 BOM이 없음을 의미하고 true는 BOM이 있음을 의미합니다.

ANSI가 아닌 문자를 포함하지 않는 BOM이없는 파일은 ANSI 파일과 정확히 동일하기 때문에 ANSI 인코딩을 얻습니다. "hi there"문자열에 몇 가지 특수 문자를 입력하면 ANSI 인코딩이 BOM없이 변경되는 것을 볼 수 있습니다.


1

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();  
    }    

이것이 실제로 출력 파일에서 세 개의 선행 문자를 제거하는지 확인하는 것은 오해의 소지가 있습니다. 예를 들어 Notepad ++ (www.notepad-plus-plus.org) 를 사용하는 경우 "Encode in 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.