Visual Basic RichTextBox i problem z BOM

0

Chciałem zapisać do pliku tekst z RichTextBox i mam problem z BOM
Na początku zapisywanego pliku pojawia się 0xEF, 0xBB, 0xBF- byte order mark (BOM) a później to co jest w RichTextBox
Plik będzie wysyłany na dość specyficzne urządzenie i nie mogę mieć takich "dodatków"

Public Class Form1

    Private strFileName As String


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


        With SaveFileDialog1
            .DefaultExt = "h"
            .FileName = strFileName
            .Filter = "Pliki programów (*.h)|*.h|Wszystkie pliki (*.*)|*.*"
            .FilterIndex = 1
            .OverwritePrompt = True
            .Title = "Okno dialogowe Zapisz"
        End With
        If SaveFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
            Try
                strFileName = SaveFileDialog1.FileName
                My.Computer.FileSystem.WriteAllText(strFileName, RichTextBox1.Text, False)
            Catch ex As Exception
                MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If
    End Sub
End Class

Właściwie to jest cała moje "testowa aplikacja". Na formatce jest jeszcze RichTextBox1 i Button1
Całość w zipie wrzuciłem w załączniku.

Używam Microsoft Visual Basic 2010

To samo dzieje mi się z TexBox

Jak poradzić sobie z usunięciem tych 3 bajtów ?

0

Otwórz ten plik np. w Notepad++ i zaznacz opcję UTF-8 bez BOM.

0xEF, 0xBB, 0xBF - to jest heurystyka zapisania pliku w kodowaniu UTF-8 z BOM. Jak chcesz to zobaczyć, to otwórz plik za pomocą hex edytora i zobaczysz wtedy, że tak jest w rzeczywistości.

0

Wolałbym nie iść w tą stronę.
Wiem, że wystarczy, że skopiuje do notatnika tekst z pliku i zapiszę to jeszcze raz, ale ktoś inny będzie używał tego programu i chcę żeby pliki były tworzone bez tych 3 początkowych bajtów.

Plik testowałem w Total Comanderze i wygląda to tak:

screenshot-20190913205848.png

0

Jako, że nie piszę w VISUAL BASICu zanadto, to posilę się źródłami.

Finally figured it out. You need to read the ANSI file as ISO-8559, convert to UTF8 and write without BOM.

> Sub WriteANSItoUF8WithoutBOM()
>     Dim UTFStream As New ADODB.Stream
>     Dim ANSIStream As New ADODB.Stream
>     Dim BinaryStream As New ADODB.Stream
> 
>     ANSIStream.Type = adTypeText
>     ANSIStream.Mode = adModeReadWrite
>     ANSIStream.Charset = "iso-8859-1"
>     ANSIStream.Open
>     ANSIStream.LoadFromFile "C:\temp\ISO8859test.txt"  'ANSI File
>     
>     UTFStream.Type = adTypeText
>     UTFStream.Mode = adModeReadWrite
>     UTFStream.Charset = "UTF-8"
>     UTFStream.Open
>     ANSIStream.CopyTo UTFStream
>     
> 
>     UTFStream.Position = 3 'skip BOM
>     BinaryStream.Type = adTypeBinary
>     BinaryStream.Mode = adModeReadWrite
>     BinaryStream.Open
> 
>     'Strips BOM (first 3 bytes)
>     UTFStream.CopyTo BinaryStream
> 
>     BinaryStream.SaveToFile "c:\temp\UTF8testnoBOM.txt", adSaveCreateOverWrite
>     BinaryStream.Flush
>     BinaryStream.Close
> End Sub

Tak jak piszą. Musisz zapisać plik w kodowaniu ISO-8559, dokonać konwersji do UTF-8 i zapisać tenże plik bez BOM.

0

Też dopiero zaczynam z VB.

Poszperałem trochę po przykładach i znalazłem coś takiego:

Using sw As StreamWriter = New StreamWriter(nazwaPliku)
       For Each wiersz As String In tekst
             sw.WriteLine(wiersz)
       Next
       sw.Close()
End Using

Trzeba importować : Imports System.IO

Plik jest tworzony bez BOM (ma zero bajtów) więc rozwiązuje to mój problem.

Próbowałem zastosować Twój przykład ale miałem problem z wczytaniem zawartości RichTexBoxa

1 użytkowników online, w tym zalogowanych: 0, gości: 1