Estou tentando criar um arquivo de texto usando VB.Net com codificação UTF8, sem BOM. Alguém pode me ajudar, como fazer isso?
Posso escrever arquivos com codificação UTF8, mas como remover a marca de ordem de bytes dele?
edit1: Eu tentei um código como este;
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 criado apenas com codificação UTF8 e 2.html criado com formato de codificação ANSI.
Abordagem simplificada - http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html
vb.net
encoding
file-handling
byte-order-mark
Vijay Balkawade
fonte
fonte
Respostas:
Para omitir a marca de ordem de byte (BOM), seu fluxo deve usar uma instância
UTF8Encoding
diferente deSystem.Text.Encoding.UTF8
(que é configurada para gerar um BOM). Existem duas maneiras fáceis de fazer isso:1. Especificando explicitamente uma codificação adequada:
Chame o
UTF8Encoding
construtor comFalse
para oencoderShouldEmitUTF8Identifier
parâmetro.Passe a
UTF8Encoding
instância para o construtor de fluxo.2. Usando a codificação padrão:
Se você não fornecer um
Encoding
paraStreamWriter
's construtor em tudo,StreamWriter
vai pelo uso padrão uma codificação UTF8 sem BOM, então o seguinte deve funcionar tão bem:Por fim, observe que omitir o BOM só é permitido para UTF-8, não para UTF-16.
fonte
My.Computer.FileSystem.WriteAllText
grava o BOM se nenhuma codificação for especificada.My.Computer.FileSystem.WriteAllText
é uma exceção a este respeito, adivinhando para compatibilidade com VB com versões anteriores, talvez?File.WriteAllText
o padrão é UFT8NoBOM.Experimente isto:
fonte
Simplesmente use o método
WriteAllText
deSystem.IO.File
.Verifique o exemplo de File.WriteAllText .
fonte
Observação interessante a respeito disso: estranhamente, o método estático "CreateText ()" da classe System.IO.File cria arquivos UTF-8 sem BOM.
Em geral, esta é a fonte de bugs, mas no seu caso poderia ter sido a solução mais simples :)
fonte
Se você não especificar um
Encoding
ao criar um novo,StreamWriter
oEncoding
objeto padrão usado é aqueleUTF-8 No BOM
criado por meio denew UTF8Encoding(false, true)
.Portanto, para criar um arquivo de texto sem o uso de BOM dos construtores que não exigem que você forneça uma codificação:
fonte
leaveOpen
?StreamWriter
usa. Você precisará especificarnew UTF8Encoding(false, true)
para que sua codificação seja capaz de especificarleaveOpen
e não ter o BOM.Acho que Roman Nikitin está certo. O significado do argumento do construtor é invertido. Falso significa sem BOM e verdadeiro significa com BOM.
Você obtém uma codificação ANSI porque um arquivo sem um BOM que não contém caracteres não-ansi é exatamente o mesmo que um arquivo ANSI. Experimente alguns caracteres especiais em sua string "hi there" e você verá a codificação ANSI mudar para sem BOM.
fonte
Codificação XML UTF-8 sem BOM
Precisamos enviar dados XML ao EPA e seu aplicativo que recebe nossa entrada requer UTF-8 sem BOM. Sim, o UTF-8 simples deve ser aceitável para todos, mas não para o EPA. A resposta para fazer isso está nos comentários acima. Obrigado Roman Nikitin .
Aqui está um snippet C # do código para a codificação XML:
Ver se isso realmente remove os três caracteres principais do arquivo de saída pode ser enganoso. Por exemplo, se você usar o Notepad ++ (www.notepad-plus-plus.org), ele irá relatar “Encode in ANSI”. Eu acho que a maioria dos editores de texto está contando com os caracteres BOM para saber se é UTF-8. A maneira de ver isso claramente é com uma ferramenta binária como WinHex (www.winhex.com). Como estava procurando uma diferença entre o antes e o depois, usei o aplicativo Microsoft WinDiff .
fonte
Pode ser que o texto de entrada contenha uma marca de ordem de bytes. Nesse caso, você deve removê-lo antes de escrever.
fonte
Dá os resultados que você deseja (eu acho).
fonte