HTML-Datei in RTB laden - editieren - richtig speichern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von FeelingCodeAgain.

    HTML-Datei in RTB laden - editieren - richtig speichern

    Liebe Alle,

    nachdem ihr mir zuletzt wirklich toll geholfen habt (auch wenn es manchmal teilweise etwas zu hoch für mich war), komme ich nun mit einem neuen Problem, für welches ich gerne eure Hilfe in Anspruch nehmen würde. Wie immer: Bitte um Nachsicht, ich bin kein (!) Könner!

    Auf einer Form habe ich zwei Richtextboxen. Die eine heisst "txtBoxLeft", die andere heisst "txtBoxMain". In beide soll jeweils eine HTML-Seite geladen werden. In "Left" die Navigations-leiste, in "Main" quasi der Haupttext. Das ist aus einem fest bestehenden System auf das ich keinen Einfluss habe.
    Eigentlich funktioniert "alles". Ich kann die Seiten laden, editieren und speichern. Zum Thema, funktioniert alles.
    Ist nicht umsonst in Anführungszeichen geschrieben. Es sieht nach dem Laden gut aus - editieren sieht auch aus, als würde es gehen, aber spätestens nach dem Speichern zerhagelt es mir den Code (falsche Codierung). Aber wie ich dies richtig angehe, weiß ich nicht. Ich habe hier bereits Beispiele gesehen, diese waren aber zu spezifisch und ich konnte (vielleicht war ich auch auf den falschen Seiten) den richtigen Code bzw. eine Logik, die ich auch verstehe, nicht finden.

    Mein Code sieht so aus (bitte nicht auslachen). Datei laden, Left (Navigations-Bar):

    VB.NET-Quellcode

    1. Try
    2. '----------------from here left / navigation frame
    3. OpenFileDialogLeft.Filter = "HTML-Datei (*.html|HTML)"
    4. OpenFileDialogLeft.FileName = "left.html"
    5. resultleftFrame = OpenFileDialogLeft.ShowDialog()
    6. pathLeftFrame = OpenFileDialogLeft.FileName 'Get the file name.
    7. TextLeftFrame = File.ReadAllText(pathLeftFrame) 'Read in text.
    8. If resultleftFrame = Windows.Forms.DialogResult.OK Then ' Test result.
    9. lblLoadedLeftFrame.Text = "Datei geladen: " & pathLeftFrame
    10. 'seems fine.
    11. txtBoxLeft.Text = TextLeftFrame
    12. End If
    13. Catch ex As Exception
    14. MessageBox.Show(ex.Message) 'Errormsg
    15. End Try


    Datei laden, Main (Haupttext):

    VB.NET-Quellcode

    1. Try
    2. '----------------from here left / navigation frame
    3. OpenFileDialogMain.Filter = "HTML-File (*.html)|(*.HTML)"
    4. OpenFileDialogMain.FileName = "main.html"
    5. resultMainFrame = OpenFileDialogMain.ShowDialog()
    6. pathMainFrame = OpenFileDialogMain.FileName 'Get the file name.
    7. TextMainFrame = File.ReadAllText(pathMainFrame) 'Read in text.
    8. If resultMainFrame = Windows.Forms.DialogResult.OK Then ' Test result.
    9. lblLoadedMainFrame.Text = "Datei geladen: " & pathMainFrame
    10. 'seems just fine.
    11. txtBoxMain.Text = TextMainFrame
    12. End If
    13. Catch ex As Exception
    14. MessageBox.Show(ex.Message) 'Errormsg
    15. End Try


    Dateien speichern:

    VB.NET-Quellcode

    1. Try
    2. Dim File1Nav As String = String.Empty
    3. Dim File2Main As String = String.Empty
    4. If txtBoxLeft.Text <> "" Then
    5. File1Nav = LTrim(RTrim(txtBoxLeft.Text))
    6. Else
    7. MsgBox("Error, exiting this function", vbCritical)
    8. Exit Sub
    9. End If
    10. If txtBoxMain.Text <> "" Then
    11. File2Main = LTrim(RTrim(txtBoxMain.Text))
    12. Else
    13. MsgBox("Error, exiting this function", vbCritical)
    14. Exit Sub
    15. End If
    16. 'MsgBox("not implemented yet")
    17. SaveFileDialog.Filter = "HTML-File (*.html)|(*.HTML)"
    18. SaveFileDialog.FileName = "left.html"
    19. SaveFileDialog.AddExtension = True
    20. File1Nav = SaveFileDialog.FileName
    21. If SaveFileDialog.ShowDialog = Windows.Forms.DialogResult.OK AndAlso SaveFileDialog.FileName <> "" Then
    22. txtBoxLeft.SaveFile(SaveFileDialog.FileName, RichTextBoxStreamType.PlainText)
    23. End If
    24. SaveFileDialog.Filter = "HTML-File (*.html)|(*.HTML)"
    25. SaveFileDialog.FileName = "main.html"
    26. SaveFileDialog.AddExtension = True
    27. File2Main = SaveFileDialog.FileName
    28. If SaveFileMain.ShowDialog = Windows.Forms.DialogResult.OK AndAlso SaveFileMain.FileName <> "" Then
    29. txtBoxMain.SaveFile(SaveFileMain.FileName, RichTextBoxStreamType.PlainText)
    30. End If
    31. Catch ex As Exception
    32. MessageBox.Show(ex.Message) 'Errormsg
    33. End Try


    Mir fehlt offenbar einfach noch zuviel Kenntnis, welche mal vor 11 Jahren da war..:
    - wie öffne und speichere ich im richtigen Format? Ich denke mal, es ist UTF-8, bin mir aber nicht ganz sicher. Und wenn ja, wie geht das? Also was muss ich ändern oder ergänzen?
    - kann man "auf die Schnelle" einen Parser bauen, der ü,ä und die üblichen Sonderzeichen "live", sprich beim Editieren (oder spätestens beim Speichern) richtig umwandelt?
    Ich habe im gleichen Projekt z.B. für eine Textbox sämtliche Sonderzeichen gesperrt (Button XY (..) txtHeadingNavBar.KeyPress), da funktioniert das 1A. Aber bei einer RichtextBox scheint das meine Kompetenz total zu übersteigen (außerdem geht es in dem Fall nicht ums sperren sondern umwandeln).
    Ich habe mich bereits bemüht, aber diese Funktion funktioniert nicht.. :( Vielleicht geht es einfacher, oder ... ich weiß nicht weiter.

    VB.NET-Quellcode

    1. Public Function Correct_HTML_Syntax(strText As String) As String
    2. strText = Replace(strText, "&", "&amp;")
    3. strText = Replace(strText, "Ä", "&Auml;")
    4. strText = Replace(strText, "Ö", "&Ouml;")
    5. strText = Replace(strText, "Ü", "&Uuml;")
    6. strText = Replace(strText, "ß", "&szlig;")
    7. strText = Replace(strText, "ä", "&auml;")
    8. strText = Replace(strText, "ö", "&ouml;")
    9. strText = Replace(strText, "ü", "&uuml;")
    10. strText = Replace(strText, "À", "&Agrave;")
    11. strText = Replace(strText, "à", "&agrave;")
    12. strText = Replace(strText, "Á", "&Aacute;")
    13. strText = Replace(strText, "©", "&copy;")
    14. strText = Replace(strText, "®", "&reg;")
    15. strText = Replace(strText, "–", "&ndash;")
    16. strText = Replace(strText, "—", "&mdash;")
    17. Correct_HTML_Syntax = strText
    18. End Function


    Ich hoffe, ich habe mich so ausgedrückt, dass es einigermaßen verständlich ist. Über Hilfestellungen würde ich mich sehr freuen!
    Beste Grüße, Alex :saint:
    @FeelingCodeAgain Könntest Du Dein Problem konkreter beschreiben.

    In dieser .Hmtl-Datei (bsp. Html Textstelle) ändere ich genau das "XYZ" dann speichere ich und erwarte "ABC" aber es kommt "GHJ".

    Wenn ich nur kurz mal folgendes mache input.html Datei mit notepad erstellt Inhalt ist -leer- .

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. string input;
    4. string output;
    5. public Form1()
    6. {
    7. InitializeComponent();
    8. }
    9. private void BtnRead_Click(object sender, EventArgs e)
    10. {
    11. input = File.ReadAllText("input.html");
    12. RtxbxShow.Text = input;
    13. }
    14. private void BtnWrite_Click(object sender, EventArgs e)
    15. {
    16. RtxbxShow.Text += "<p>TESTEST ÜÖÜÖÜÖÜÖÜ?ßßßßßß<p>";
    17. output = RtxbxShow.Text;
    18. File.WriteAllText("output.html", output);
    19. }
    20. }

    Kommt in der Output Datei genau das an was ich erwarten würde; ohne Probleme bei Sonderzeichen etc.
    <p>TESTEST ÜÖÜÖÜÖÜÖÜ?ßßßßßß<p>

    Wo liegt das Problem?!

    Zwei Hinweise:
    1. ein weit verbreiteter Ansatz ist Html Code mit html-agility-pack.net zu bearbeiten.

    2. eventuell liegt dein Problem an Sachen wie NonBreaking Whitespace etc. Sachen die nicht in der RichTextbx angezeigt werden CR LF etc.
    codewars.com Rank: 4 kyu
    Also du willst irgendwas öffnen, was der User wählt, ok.
    Ja, da muss man sich das Encoding merken, und beim Abspeichern dasselbe Encoding wieder verwenden.
    Das Encoding kann man beim Einlesen einer Datei ermitteln.

    sowas wäre vlt. eine Möglichkeit:

    VB.NET-Quellcode

    1. Private _CurrentEncoding As Encoding
    2. Private Function ReadText(pth As String) As String
    3. Using sr = New StreamReader(pth, Encoding.Default)
    4. ReadText = sr.ReadToEnd
    5. Me._CurrentEncoding = sr.CurrentEncoding
    6. End Using
    7. End Function
    8. Private Sub WriteText(pth As String, content As String)
    9. File.WriteAllText(pth, content, _CurrentEncoding)
    10. End Sub

    Wobei man WriteText() auch weglassen kann, und File.WriteAllText() direkt verwenden - eben mit Encoding-Angabe.