ANSI Text einlesen

  • VB.NET
  • .NET 5–6

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    ANSI Text einlesen

    Eigentlich habe ich diese Problem seit dem Anfang aber Kleinigkeiten zum Schluß....
    Ich lese Daten ein welche überwiegend mit unserem Berechnungsprogram aus der VB6 Zeit erstellt wurden. Notpad++ sagt es wäre ANSI. Neue Daten aus VS2022 werdn in UTF-8 gespeichert. Öffne ich alte Dateien so habe ich diese schwarzen Karos mit den Fragezeichen drin. Ich habe mein Code (natürlich ohne Erfolg) so probiert:

    VB.NET-Quellcode

    1. Dim myStream As System.IO.StreamReader = Nothing
    2. Dim openFileDialog As New OpenFileDialog()
    3. openFileDialog.Filter = "Profil Datei (*.evo)|*.evo|All files (*.*)|*.*"
    4. openFileDialog.FilterIndex = 1
    5. openFileDialog.RestoreDirectory = True
    6. If openFileDialog.ShowDialog() = System.Windows.Forms.DialogResult.Cancel Then
    7. Exit Sub
    8. End If
    9. myStream = My.Computer.FileSystem.OpenTextFileReader(openFileDialog.FileName, System.Text.Encoding.ANSI)
    10. FrmMain.LblKunde.Text = myStream.ReadLine
    11. FrmMain.LblBeschreibung.Text = myStream.ReadLine
    12. FrmMain.LblKomNr.Text = myStream.ReadLine
    13. FrmMain.lblBearbeiter.Text = myStream.ReadLine


    Weiß jemand wie ich die Daten richtig einlesen kann?

    JLH schrieb:

    VB.NET-Quellcode

    1. myStream = My.Computer.FileSystem.OpenTextFileReader(openFileDialog.FileName, System.Text.Encoding.ANSI)
    Probier mal
    System.Text.Encoding.GetEncoding(437)
    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!
    Das � erhalte ich immer dann, wenn ich z.B. mit IO.File.ReadAllLines ANSI-Dateien einlese, aber als Encoding UTF-8 angebe.
    Probier es daher mal mit … eh … mit welchem Framework arbeitest Du? 4.8 kennt kein System.Text.Encoding.ANSI
    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.
    Hallo,
    StreamReader implementiert IDisposable und sollte somit disposed werden! Entweder direkt, wenn du fertig mit lesen bist, oder du verwendest einen Using-Block.
    Bist du sicher, das der Code kompiliert? System.Text.Encoding.ANSI gibt es doch gar nicht. Du musst herausfinden, mit welcher Codepage deine Datei geschrieben wurde. Dann kannst du mit System.Text.Encoding.GetEncoding(codePage) das korrekte Encoding übergeben.
    @Rod Neee, funzt nicht. System.NotSupportedException: "No data is available for encoding 437. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method."
    @VaporiZed ich verwende .Net 6.0, kein .Net Framework.
    @ISliceUrPanties da im Moment 99,999% meiner Dateien ANSI sind würde ich mich zunächst mit dem öffnen dieser als solche begnügen... Und ja, so kompiliert das.

    Stop! Eh nein... jetzt nicht mehr. Bevor ich dieses Post verfasst habe hatte ich "ANSI" und dann "UTF8" probiert. Beides ohne Erfolg. Jetzt wieder auf "ANSI" geändert und es geht nicht (mehr) ?(

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

    Dass Du .NET 6 verwendest, gehört zur Klarstellung in die Thread-Tags. Ich ergänz das mal …

    ANSI gibt es aber auch nicht in .NET

    Laut .NET-DLL gibt es:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. '
    2. ' Zusammenfassung:
    3. ' Gets an encoding for the UTF-8 format.
    4. '
    5. ' Rückgabewerte:
    6. ' An encoding for the UTF-8 format.
    7. Public Shared ReadOnly Property UTF8 As Encoding
    8. '
    9. ' Zusammenfassung:
    10. ' Gets an encoding for the UTF-7 format.
    11. '
    12. ' Rückgabewerte:
    13. ' An encoding for the UTF-7 format.
    14. <Obsolete("The UTF-7 encoding is insecure and should not be used. Consider using UTF-8 instead.", DiagnosticId:="SYSLIB0001", UrlFormat:="https://aka.ms/dotnet-warnings/{0}")>
    15. Public Shared ReadOnly Property UTF7 As Encoding
    16. '
    17. ' Zusammenfassung:
    18. ' Gets an encoding for the UTF-32 format using the little endian byte order.
    19. '
    20. ' Rückgabewerte:
    21. ' An encoding object for the UTF-32 format using the little endian byte order.
    22. Public Shared ReadOnly Property UTF32 As Encoding
    23. '
    24. ' Zusammenfassung:
    25. ' Gets an encoding for the UTF-16 format using the little endian byte order.
    26. '
    27. ' Rückgabewerte:
    28. ' An encoding for the UTF-16 format using the little endian byte order.
    29. Public Shared ReadOnly Property Unicode As Encoding
    30. '
    31. ' Zusammenfassung:
    32. ' Gets an encoding for the UTF-16 format that uses the big endian byte order.
    33. '
    34. ' Rückgabewerte:
    35. ' An encoding object for the UTF-16 format that uses the big endian byte order.
    36. Public Shared ReadOnly Property BigEndianUnicode As Encoding
    37. '
    38. ' Zusammenfassung:
    39. ' Gets an encoding for the Latin1 character set (ISO-8859-1).
    40. Public Shared ReadOnly Property Latin1 As Encoding
    41. '
    42. ' Zusammenfassung:
    43. ' Gets an encoding for the ASCII (7-bit) character set.
    44. '
    45. ' Rückgabewerte:
    46. ' An encoding for the ASCII (7-bit) character set.
    47. Public Shared ReadOnly Property ASCII As Encoding
    48. '
    49. ' Zusammenfassung:
    50. ' Gets the default encoding for this .NET implementation.
    51. '
    52. ' Rückgabewerte:
    53. ' The default encoding for this .NET implementation.
    54. Public Shared ReadOnly Property [Default] As Encoding


    Und wenn man System.Text.Encoding.Default in .NET verwendet, bekommt man das UTF-8-Encoding. Und was rauskommt, wenn man ANSI-Dateien mit UTF-8-Encoding ausliest, hab ich bereits in Post#3 geschrieben: Sonderzeichen wie das von Dir beobachtete �
    Bilder
    • NoAnsi.png

      41,59 kB, 1.243×374, 52 mal angesehen
    • Encodings.png

      20,61 kB, 849×559, 47 mal angesehen
    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 5 mal editiert, zuletzt von „VaporiZed“ ()

    Ich bin mir nicht ganz sicher, dass du verstanden hast, worauf ich hinaus will.
    System.Text.Encoding.ANSI gibt es nicht - auch nicht unter .NET 6, siehe Doku. Den ANSI-Standard gibt es mit diversen Codepages. Wenn du eine falsche auswählst, hast du halt komische Zeichen in deinem Text. (Dylan Beattie spricht int diesem Video über ebendiese Problematik - sehr kurzweilig :))
    Ich würde es mal mit cp 1250 oder 1252 versuchen.

    Quellcode

    1. myStream = My.Computer.FileSystem.OpenTextFileReader(openFileDialog.FileName, System.Text.Encoding.GetEncoding(1250))
    Ah, ok, es gab einen Edit in Post#5.
    Also: ANSI scheint es auch bei Dir nicht zu geben.
    Jetzt ist die Frage, wie es weitergeht. Ich hatte neulich ein ähnliches Problem mit alten Dateien. Da habe ich mir über ein kleines .NET-Framework-Programm schnell alle Dateien (nach einem Dateibackup ;) ) per System.Text.Encoding.Default (in .NET-Framework = ANSI) eingelesen und mit System.Text.Encoding.UTF8 wieder in die Dateien geschrieben, sodass ich das mit meinen neuen .NET-Programmen langfristig nutzen kann.
    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.
    @VaporiZed: Danke. Das es da eine Unterscheidung gibt wußte ich nicht.
    @ISliceUrPanties: Stimme ich Dir zu... siehe meine Verbesserung. Könnte schwören ich hatte es so stehen gehabt...

    Es ist wohl 1252 aber damit bekomme ich es auch nicht auf (siehe Post#6) mit 28591 sind die Buchstaben korrekt.
    Ich habe jetzt aber eine viel größere Schwierigkeit entdeckt... Zum Testen wollte ich eine neue Datei mit Umlauten im Text anlegen. Fülle ich in meine Felder Wörter mit einen Umlaut ein kommt sofort eine Fehlermeldung "No data availible for encoding 1252." (Wie kann man ein Bild einfügn) Diese Problem müßte ich jetzt zuerst mal lösen...

    JLH schrieb:

    Fülle ich in meine Felder Wörter mit einen Umlaut ein kommt sofort eine Fehlermeldung
    Und wie lautet der Code, der dazu führt? Wenn man Daten in eine normale TextBox einfügt, passiert sowas garantiert nicht. Welcher Code läuft also zu diesem Zeitpunktt ab? Und warum hast Du Codepage 1252 eingestellt, wenn Du weißt, dass Du 28591 brauchst?
    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.
    Ok... verzeiht mir, aber ich frage mich jetzt was ist das für eine Schei... Ich bin mit VS 2022 brav von .Net Framework zu .Net 6.0 weil das angeblich so besser ist. Ich verwende seit VB6 folgende Zeilen um meine Eingaben zu prüfen. Ein bisschen mehr oder weniger wenn es um . , + - 1 2 3 4 5 6 7 8 9 0 geht.

    VB.NET-Quellcode

    1. Private Sub Eingabe_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Eingabe.KeyPress
    2. Dim KeyAscii As Short = Asc(e.KeyChar)
    3. If KeyAscii = 13 Then
    4. System.Windows.Forms.SendKeys.Send("{TAB}")
    5. KeyAscii = 0
    6. End If
    7. e.KeyChar = Chr(KeyAscii)
    8. If KeyAscii = 0 Then
    9. e.Handled = True
    10. End If
    11. End Sub


    In .Net Framework ist alles super wie immer, in .Net 6.0 nada. Hab zum Testen eine Form mit TextBox erstellt und den Code eingesetzt. Was kann man machen damit .Net 6.0 was die Codepages angeht die selbe Funktionalität wie .Net Framework hat? Hat es einen tiefen Sinn das man das jetzt aus .Net kastriert hat?
    Bilder
    • Screenshot 2023-08-14 114401.png

      18,13 kB, 417×223, 48 mal angesehen
    Du vermischst nun also VB6-Funktionen mit dem neuesten Unterbau …
    28591 und 1252* sind einige wenige von vielen Codepages, die aber nicht genügend Zeichen enthält, um mit den neuesten internationalen Anforderungen gerecht zu werden.
    Auch wenn das zu lösende Problem inhaltlich komplett anders angehen würde, probier mal:

    VB.NET-Quellcode

    1. Private Sub Eingabe_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Eingabe.KeyPress
    2. Dim KeyAscii = Convert.ToInt16(e.KeyChar)
    3. If KeyAscii = 13 Then
    4. System.Windows.Forms.SendKeys.Send("{TAB}")
    5. KeyAscii = 0
    6. End If
    7. e.KeyChar = Convert.ToChar(KeyAscii)
    8. If KeyAscii = 0 Then
    9. e.Handled = True
    10. End If
    11. End Sub


    *offensichtlich arbeitet Asc mit 1252.

    Vielleicht liegt es auch daran, dass die 1252 nicht registriert ist, siehe stackoverflow.
    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.
    Naja.... ich habe mit VB2005 glaube ich war's die Sache konvertiert. Dabei kam ein Code raus der mehr oder weniger geändert werden mußte. Die originl Zeilen sind

    Visual Basic-Quellcode

    1. Private Sub txtBearbeiter_KeyPress(KeyAscii As Integer)
    2. If KeyAscii = 13 Then
    3. SendKeys "{TAB}"
    4. KeyAscii = 0
    5. End If
    6. End Sub


    Ich versuch aber gerne Deinen Vorschlag. Ich bin aber für jede Verbesserung offen. Ich habe eben nichts geändert wenn es lief.

    Nicht, daß wir jetzt die zwei Themen verwechseln...
    Und warum hast Du Codepage 1252 eingestellt, wenn Du weißt, dass Du 28591 brauchst?
    Hab ich ja nicht... Als ich im Program mit dem ich speichere die Fehlermeldung bekommen habe stand da ja drin "No Data for 1252..." Also gehe ich davon aus, daß das VB6 Program die Daten als solche abgelegt hat. Mein Neues kann diese Daten mit 1252 nicht öffnen da 1252 nicht im .Net enthalten ist. Hab ich ja erst bemerkt als ich es probiert habe. Das 28591 habe ich dann im Codepage gefunden. Mit dem hat das Öffnen der Alten Dateien funktioniert. Jetzt habe ich also alte Dateien im 1252 Format und neue im UTF-8. Mit einem neuen Programm was etwas völlig anderes ist sollen nun die Berechnungen weiterverarbeitet werden. Jetzt kommt natürlich die Arbeit mit der Abfrage ob es eine neue oder alte Datei ist... :) Dein Code oben verwende ich jetzt im "Speicher Programm" damit Herr Müller auch Kunden mit Umlauten im Namen speichern kann.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „JLH“ ()

    JLH schrieb:

    Jetzt kommt natürlich die Arbeit mit der Abfrage ob es eine neue oder alte Datei ist
    Ist ja leicht rauszufinden. Datei mit Encoding einlesen und schauen, ob es passen könnte:

    VB.NET-Quellcode

    1. Private Sub CheckFileForFittingCodepage(FilePath As String)
    2. System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance) 'siehe Post#13
    3. For Each Codepage In {1252, 28591, 65001}
    4. Dim DecodedText = IO.File.ReadAllText(FilePath, System.Text.Encoding.GetEncoding(Codepage))
    5. If "äöüÄÖÜ".Any(Function(x) DecodedText.Contains(x)) Then MessageBox.Show($"Codepage {Codepage} würde passen.")
    6. Next
    7. End Sub
    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.
    Wie funktioniert Ansi Text bei Net core? ?(

    Ein Consolen Testprogramm:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Text
    3. Imports System.IO
    4. Module Program
    5. Sub Main(args As String())
    6. Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)
    7. 'Für » nicht Standard NET Codepages « erforderlich
    8. 'NET Standard CPs: Ascii, UTF8, UTF16 (LE/BE), UTF32 (LE/BE), Iso-8859-1(28591)
    9. 'Siehe
    10. 'https://learn.microsoft.com/en-us/dotnet/api/system.text.encoding.getencodings?view=net-7.0#system-text-encoding-getencodings
    11. 'unter NOTE
    12. Dim Pfad As String = "d:\#1\" '<---- anpassen
    13. Dim t As String = "aäöüÄÖÜ߀z"
    14. 'UTF8 mit BOM
    15. File.WriteAllText(Pfad & "UTF8mB.txt", t, Encoding.UTF8)
    16. 'UTF8 ohne BOM
    17. File.WriteAllText(Pfad & "UTF8oB.txt", t)
    18. 'oder
    19. 'File.WriteAllText(Pfad & "UTF8oB.txt", t, Encoding.Default)
    20. ' CP 28591
    21. File.WriteAllText(Pfad & "28591.txt", t, Encoding.GetEncoding(28591))
    22. 'Hier fehlt das Eurozeichen, weil die Zeichen 128 bis 159 bei
    23. 'Iso-8859-1 Steuerzeichen sind
    24. 'Ascii
    25. File.WriteAllText(Pfad & "ascii.txt", t, Encoding.ASCII)
    26. 'Siehe Ergebnis
    27. 'UTF16
    28. File.WriteAllText(Pfad & "utf16.txt", t, Encoding.Unicode)
    29. 'Ansi
    30. File.WriteAllText(Pfad & "ansi.txt", t, Encoding.GetEncoding(1252))
    31. 'OEM 850 DOS
    32. File.WriteAllText(Pfad & "DOS.txt", t, Encoding.GetEncoding(850))
    33. 'Eurozeichen gab's zu DOS Zeiten noch nicht
    34. End Sub
    35. End Module
    Ich verstehe Deinen Post nicht. Ist das jetzt Code, der nicht wie gewünscht funktioniert oder ein Testprogramm, um zu zeigen, wie es geht? Scheint zwar letzteres zu sein, aber dann find ich Deine Formulierung verwirrend.
    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.