System.Text.Encoding-Wert setzen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    System.Text.Encoding-Wert setzen

    Hallo!

    Wie setze ich einen System.Text.Encoding-Wert?

    Mit TextBox1.Text = My.Computer.FileSystem.ReadAllText(My.Application.Info.DirectoryPath & "\signaturen\" & SignaturZahl(SpielerDatum) & ".txt", System.Text.Encoding.UTF8) wird ein Text aus einer txt-Datei eingelesen.

    Der Wert UTF8 gibt hier als einzigstes korrekt Umlaute aus.

    Wenn nun eine MsgBox einen Text ausgeben soll, der zuvor aus einer ini-Datei gelesen wurde, werden die Umlaute wieder zerschossen. Den Befehl System.Text.Encoding.Default als solches stehen zu lassen, um einen Wert zu setzen, bevor die MsgBox folgt scheint so nicht zu funktionieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    @Selter98 UTF8 gibt nix aus, sondern sorgt dafür, dass die Bytes auf der Festplatte richtig Chars in der String-Variable zugeordnet werden.
    Innerhalb eines .NET-Programms gibt es nur Unicode-Strings, da spielt das Encoding keine Rolle.
    Wenn der Text in Deiner MessageBox falsch angezeigt wird, hast Du das falsche Encoding verwendet.
    Poste mal nen Screenshot der MessageBox und das kommunizierende Strück Text der Datei (als Dateianhang).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    hasz du es mit -Default- probiert ?

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. 'lesen aus Datei
    3. Dim UmlautText As String = IO.File.ReadAllText("E:\myfile.txt", System.Text.Encoding.Default)
    4. TextBox1.Text = UmlautText
    5. 'ohne :
    6. ' Dim UmlautText As String = IO.File.ReadAllText("E:\myfile.txt")
    7. ' W�rde, W�rter, H�tte gerne W�rste zum essen, W�rste im �rztehaus, �rzte, h�tteste
    8. End Sub
    @Kasi:

    Selter98 schrieb:

    Der Wert UTF8 gibt hier als einzigstes korrekt Umlaute aus.

    Selter98 schrieb:

    System.Text.Encoding.Default […] scheint so nicht zu funktionieren.

    @Selter98: Ist es eine Option, die INI-Datei anders zu generieren bzw. deren Encoding zu ändern? Letzteres ginge mit dem Standard-Windows-Editor/Notepad mit [Speichern unter …] und dann rechts unten Encoding einstellen. Oder Du importierst eben die Daten jedes Mal mit der passenden Encoding-Einstellung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    System.Text.Encoding.Default ist nicht zu empfehlen.

    Details siehe:
    docs.microsoft.com/de-de/dotne….default?view=netcore-3.1
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo
    danke für die Info

    so sollte es Funktionieren

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. 'schreiben in Datei
    3. Dim encoding As Encoding = encoding.GetEncoding("ISO-8859-1")
    4. Dim oWrite As StreamWriter = New StreamWriter("E:\Check\schema.ini", False, encoding)
    5. oWrite.Write("Würde, Wörter, Hätte gerne Würste zum essen, Würste im Ärztehaus, Ärzte, hätteste")
    6. oWrite.Close()
    7. End Sub
    8. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    9. 'lesen
    10. Dim encoding As Encoding = encoding.GetEncoding("ISO-8859-1")
    11. Dim oRead As StreamReader = New StreamReader("E:\Check\schema.ini", encoding)
    12. TextBox1.Text = oRead.ReadLine()
    13. End Sub


    gruss
    kasi
    Zum einen sollten StreamWriter und StreamReader in Using-Blöcke, da sie IDisposable implementieren. Dann kann man sich das .Close() auch sparen, da dies wohl automatisch ausgeführt wird, wenn das Objekt entsorgt wird. Zum anderen: Wozu StreamReader und -Writer verwenden? Bleib doch beim IO.File.ReadAllText. Am Ende kannst Du doch auch dort das Encoding setzen:

    VB.NET-Quellcode

    1. IO.File.ReadAllText(Dateipfad, System.Text.Encoding.GetEncoding("ISO-8859-1"))

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Selter98

    Der Wert UTF8 gibt hier als einzigstes korrekt Umlaute aus.


    Das liegt wahrscheinlich daran, das die Textdatei als UTF8-Datei erstellt wurde. :D :D
    Die Encoding Angabe kannst du bei UTF8 auch weglassen.

    @mrMo
    System.Text.Encoding.Default ist nicht zu empfehlen.

    Dann erklär’ mal wie du einen vorhandenen Ansi-Text einlesen willst.

    @Kasi

    ISO-8859-1 enthält nicht alle Zeichen der Windows Ansi Codepage 1252. Z. B. kein €.


    Das Standard (Nicht Default) Encoding ist bei Textdateien UTF8.
    Bedeutet: Ohne Encoding Angabe wird UTF8 vorausgesetzt.

    Encoding.Default verwendet CP1252. (WestEuropa, USA)

    Eierlein schrieb:

    Dann erklär’ mal wie du einen vorhandenen Ansi-Text einlesen willst.
    Indem ich explizit das ANSI Encoding angebe...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    In der ini-Datei ist eine Schritt-für-Schritt-Anleitung, die in der MsgBox wie folgt ausgegeben wird:




    So sieht es in der ini-Datei aus:
    [Schritt1]
    Text=Das Spiel fängt an! Sie finden sich auf dem Hauptweg wieder, von denen sich 6 Wege abzweigen, die zu unterschiedlichen Landschaften führen.
    Aktion=OK

    [Schritt2]
    Text=Bevor Sie das Spiel auf eigene Faust fortfahren, müssen Sie noch einige technische Dinge wissen, bevor der Spielspaß beginnen kann.
    Aktion=OK

    Angegeben sind hier jeweils nur die ersten beiden Schritte (aus Gründen der Übersichtlichkeit).

    Wie kann ich die Umlaute wieder korrekt darstellen?
    @Selter98 Hänge die INI-Datei als Datei an, nicht aber Inhalt per C&P.
    Poste den Code, mit dem Du das ausliest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe das jetzt nicht ausprobiert, weil ich noch nie einen solchen Fall hatte.

    Ich könnte mir aber vorstellen, dass die INI-Datei bevor überhaupt was reingeschrieben wird, im UTF8-Format erstellt werden muss. Also so, wie @VaporiZed das schon in #4 geschrieben hat. Das lässt sicher natürlich auch per Code erstellen.

    Oder man arbeitet direkt mit
    - GetPrivateProfileString
    - WritePrivateProfileString

    und versucht den String zu codieren, so das schlussendlich ein Ansi-String vorhanden ist. Dazu habe ich mal einen Artikel auf Codeproject gelesen. Vielleicht mal nachschauen.

    codeproject.com/Tips/1147340/W…s-to-an-ASCII-INI-File-Ye


    Freundliche Grüsse

    exc-jdbi
    Nun habe ich mit Ini.WertSchreiben("Schritt" & TSchritt, "Text", "Das Spiel fängt an!") eine neue ini-Datei erstellt und den alten Krempel hinzugefügt. Nun werden die Umlaute wieder richtig ausgelesen.

    Im Editor stand unten rechts in der neuen Datei Ansi, wo vorher UTF8 stand.
    wird das ein art Hilfe für dein Spiel ?, keine Ahnung wieviel Schritte du hast aber
    hier eine Idee die Ini direct in ein Treeview zuladen




    hier der Code (alles in eine Form)

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Text
    3. Public Class Form3
    4. Friend OpenFileDialog1 As New OpenFileDialog With {.Filter = "INI Files|*.ini"}
    5. Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
    7. Dim f As New IniFile
    8. f.Load(OpenFileDialog1.FileName, Encoding.GetEncoding(1252))
    9. For Each key As String In f.Keys
    10. Dim n As TreeNode = TreeView1.Nodes.Add(key)
    11. For Each entry As String In f(key).Keys
    12. n.Nodes.Add(entry).Nodes.Add(f(key)(entry))
    13. Next
    14. Next
    15. End If
    16. End Sub
    17. End Class
    18. Public Class Ini
    19. Inherits Dictionary(Of String, Dictionary(Of String, String))
    20. Public Sub Load(filename As String, enc As Encoding)
    21. Dim sectionName As String = String.Empty
    22. Using reader As New System.IO.StreamReader(filename, Encoding.GetEncoding(1252))
    23. While Not reader.EndOfStream
    24. Dim line As String = reader.ReadLine
    25. If line.StartsWith("[") AndAlso line.EndsWith("]") Then
    26. sectionName = line.Substring(1, line.Length - 2)
    27. If Not ContainsKey(sectionName) Then
    28. Add(sectionName, New Dictionary(Of String, String))
    29. End If
    30. ElseIf line.StartsWith(";") Then
    31. ElseIf line.Contains("=") Then
    32. Dim idx As Integer = line.IndexOf("="c)
    33. Item(sectionName).Item(line.Substring(0, idx)) = line.Substring(idx + 1, line.Length - idx - 1)
    34. End If
    35. End While
    36. End Using
    37. End Sub
    38. End Class


    aufbau der Ini..

    VB.NET-Quellcode

    1. [Schritt 1]
    2. Text=Bevor Sie das Spiel auf eigene Faust fortfahren, müssen Sie noch einige technische Dinge wissen, bevor der Spielspaß beginnen kann.
    3. [Schritt 2]
    4. Text=Das Spiel fängt an! Sie finden sich auf dem Hauptweg wieder, von denen sich 6 Wege abzweigen, die zu unterschiedlichen Landschaften führen.


    einzig was nicht so schön aussieht is die Textlänge im Treeview, da musst du noch handanlegen
    falls du Treeview als anzeige nehmen willst


    gruss
    kasi