Я пытаюсь создать текстовый файл с помощью VB.Net с кодировкой UTF8 без спецификации. Кто-нибудь может мне помочь, как это сделать?
Я могу записать файл в кодировке 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
vb.net
encoding
file-handling
byte-order-mark
Виджей Балкаваде
источник
источник
Ответы:
Чтобы опустить отметку порядка байтов (BOM), ваш поток должен использовать экземпляр,
UTF8Encoding
отличный отSystem.Text.Encoding.UTF8
(который настроен для создания BOM). Это можно сделать двумя простыми способами:1. Явное указание подходящей кодировки:
Вызвать
UTF8Encoding
конструктор сFalse
дляencoderShouldEmitUTF8Identifier
параметра.Передайте
UTF8Encoding
экземпляр конструктору потока.2. Использование кодировки по умолчанию:
Если вы вообще не предоставили конструктор
Encoding
toStreamWriter
,StreamWriter
по умолчанию будет использоваться кодировка UTF8 без спецификации, поэтому следующее должно работать точно так же:Наконец, обратите внимание, что исключение спецификации допустимо только для UTF-8, но не для UTF-16.
источник
My.Computer.FileSystem.WriteAllText
пишет спецификацию, если кодировка не указана.My.Computer.FileSystem.WriteAllText
является исключением в этом отношении, возможно, предполагая обратную совместимость с VB?File.WriteAllText
по умолчанию UFT8NoBOM.Попробуй это:
источник
Просто используйте метод
WriteAllText
изSystem.IO.File
.Пожалуйста, проверьте образец из File.WriteAllText .
источник
Интересное замечание по этому поводу: как ни странно, статический метод CreateText () класса System.IO.File создает файлы UTF-8 без спецификации.
В общем, это источник ошибок, но в вашем случае это могло быть простейшее решение :)
источник
Если вы не укажете
Encoding
при создании нового объекта,StreamWriter
по умолчанию будетEncoding
использоваться объект,UTF-8 No BOM
созданный с помощьюnew UTF8Encoding(false, true)
.Итак, чтобы создать текстовый файл без спецификации, используйте конструкторы, которые не требуют от вас предоставления кодировки:
источник
leaveOpen
?StreamWriter
использует. Вам нужно будет указать,new UTF8Encoding(false, true)
чтобы ваша кодировка могла указыватьleaveOpen
и не иметь спецификации.Я считаю, что Роман Никитин прав. Значение аргумента конструктора переворачивается. Ложь означает отсутствие спецификации, а истина означает, что спецификация есть.
Вы получаете кодировку ANSI, потому что файл без спецификации, не содержащий символов, отличных от ANSI, в точности совпадает с файлом ANSI. Попробуйте ввести в строку «привет» несколько специальных символов, и вы увидите, что кодировка ANSI изменилась на без спецификации.
источник
Кодирование XML UTF-8 без спецификации
Нам нужно отправить данные XML в EPA, и их приложение, которое принимает наши входные данные, требует UTF-8 без спецификации. О да, простой UTF-8 должен быть приемлем для всех, но не для EPA. Ответ на этот вопрос находится в комментариях выше. Спасибо Роман Никитин .
Вот фрагмент кода C # для кодировки XML:
Можно ввести в заблуждение, чтобы увидеть, действительно ли это удаляет три ведущих символа из выходного файла. Например, если вы используете Notepad ++ (www.notepad-plus-plus.org), он сообщит «Кодировать в ANSI». Я предполагаю, что большинство текстовых редакторов рассчитывают на символы спецификации, чтобы определить, является ли это UTF-8. Это можно четко увидеть с помощью бинарного инструмента, такого как WinHex (www.winhex.com). Поскольку я искал разницу до и после, я использовал приложение Microsoft WinDiff .
источник
Возможно, ваш вводимый текст содержит отметку порядка байтов. В этом случае вы должны удалить его перед написанием.
источник
Дает те результаты, которые вы хотите (я думаю).
источник