Записывать текстовые файлы без метки порядка байтов (BOM)?

StackOverflow https://stackoverflow.com/questions/2437666

Вопрос

Я пытаюсь создать текстовый файл, используя VB.Net с кодировкой UTF8, без спецификации.Кто-нибудь может мне помочь, как это сделать?
Я могу записать файл в кодировке UTF8, но как удалить из него знак порядка байтов?

редактировать 1:Я пробовал подобный код следующим образом;

    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 (который настроен для генерации спецификации).Есть два простых способа сделать это:

1.Явное указание подходящей кодировки:

  1. Позвоните в UTF8Encoding конструктор с False для encoderShouldEmitUTF8Identifier параметр.

  2. Передайте UTF8Encoding экземпляр для конструктора stream.

' 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 по умолчанию будет использоваться кодировка UTF8 без спецификации, поэтому следующее должно работать так же хорошо:

' VB.NET:
Using sink As New StreamWriter("Foobar.txt")
    sink.WriteLine("...")
End Using
// C#:
using (var sink = new StreamWriter("Foobar.txt"))
{
    sink.WriteLine("...");
}

Наконец, обратите внимание, что исключение спецификации допустимо только для UTF-8, но не для UTF-16.

Другие советы

Попробуй это:

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.

Пожалуйста, проверьте образец из Файл.Записать весь текст.

Этот метод использует кодировку UTF-8 без указания порядка байтов (BOM), поэтому использование метода GetPreamble вернет пустой массив байтов.Если необходимо включить идентификатор UTF-8, такой как знак порядка байтов, в начало файла, используйте WriteAllText(строка, String, Encoding) перегрузка метода кодировкой UTF8.

Интересное замечание по этому поводу:как ни странно, статический метод "CreateText()" класса System.IO.File создает файлы в формате UTF-8 без БОМ.

В общем, это источник ошибок, но в вашем случае это могло бы быть простейшим обходным путем :)

Если вы не укажете Encoding при создании нового StreamWriter значение по умолчанию Encoding используемый объект - это UTF-8 No BOM который создается с помощью new UTF8Encoding(false, true).

Итак, чтобы создать текстовый файл без спецификации, используйте конструкторы, которые не требуют от вас предоставления кодировки:

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

Я думаю, Роман Никитин прав.Значение аргумента конструктора переворачивается.False означает отсутствие спецификации, а true - наличие спецификации.

Вы получаете кодировку ANSI, потому что файл без спецификации, который не содержит символов, отличных от ansi, точно такой же, как файл ANSI.Попробуйте ввести несколько специальных символов в строку "привет", и вы увидите, что кодировка ANSI меняется на without-BOM.

XML-кодировка UTF-8 без спецификации
Нам нужно отправить XML-данные в EPA, и их приложение, которое принимает наши входные данные, требует UTF-8 без спецификации.О да, обычный UTF-8 должен быть приемлем для всех, но не для EPA.Ответ на этот вопрос содержится в приведенных выше комментариях.Спасибо Роман Никитин.

Вот фрагмент кода на C # для кодировки XML:

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

Проверка того, действительно ли это удаляет три начальных символа из выходного файла, может ввести в заблуждение.Например, если вы используете Блокнот++ (www.notepad-plus-plus.org), то отчет “кодировать в ANSI”.Я предполагаю, что большинство текстовых редакторов рассчитывают на символы спецификации, чтобы определить, является ли это UTF-8.Способ четко увидеть это - с помощью бинарного инструмента, такого как Винхекс (www.winhex.com).Поскольку я искал разницу "до" и "после", я использовал Microsoft ВинДифф применение.

Возможно, ваш входной текст содержит знак порядка байтов.В этом случае вам следует удалить его перед записью.

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

Дает вам те результаты, которые вы хотите (я думаю).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top