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
답변
바이트 순서 표시 (BOM)를 생략하려면 스트림 UTF8Encoding
이 System.Text.Encoding.UTF8
(BOM을 생성하도록 구성된) other 인스턴스를 사용해야합니다 . 이를 수행하는 두 가지 쉬운 방법이 있습니다.
1. 적절한 인코딩을 명시 적으로 지정 :
-
매개 변수에 대해
UTF8Encoding
생성자 를 호출합니다 .False
encoderShouldEmitUTF8Identifier
-
패스
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
to 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에만 허용됩니다.
답변
이 시도:
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
답변
WriteAllText
에서 제공 하는 방법 을 사용하기 만하면 됩니다 System.IO.File
.
File.WriteAllText 의 샘플을 확인하십시오 .
이 메서드는 BOM (Byte-Order Mark)없이 UTF-8 인코딩을 사용하므로 GetPreamble 메서드를 사용하면 빈 바이트 배열이 반환됩니다. 파일 시작 부분에 바이트 순서 표시와 같은 UTF-8 식별자를 포함해야하는 경우 UTF8 인코딩으로 WriteAllText (String, String, Encoding) 메서드 오버로드를 사용합니다.
답변
이와 관련하여 흥미로운 점 : 이상하게도 System.IO.File 클래스의 정적 “CreateText ()”메서드는 BOM 없이 UTF-8 파일 을 생성합니다 .
일반적으로 이것은 버그의 원인이지만 귀하의 경우에는 가장 간단한 해결 방법 일 수 있습니다. 🙂
답변
Encoding
새로 생성 할 때를 지정하지 않으면를 통해 생성되는 StreamWriter
기본 Encoding
객체가 사용 UTF-8 No BOM
됩니다 new UTF8Encoding(false, true)
.
따라서 BOM없이 텍스트 파일을 만들려면 인코딩을 제공 할 필요가없는 생성자를 사용합니다.
new StreamWriter(Stream)
new StreamWriter(String)
new StreamWriter(String, Boolean)
답변
나는 Roman Nikitin이 옳다고 생각합니다. 생성자 인수의 의미가 뒤집 힙니다. False는 BOM이 없음을 의미하고 true는 BOM이 있음을 의미합니다.
ANSI가 아닌 문자를 포함하지 않는 BOM이없는 파일은 ANSI 파일과 정확히 동일하기 때문에 ANSI 인코딩을 얻습니다. “hi there”문자열에 몇 가지 특수 문자를 입력하면 ANSI 인코딩이 BOM없이 변경되는 것을 볼 수 있습니다.
답변
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 응용 프로그램을 사용했습니다 .