Codepage Probleme

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Codepage Probleme

    Moin Moin zusammen,

    ich stehe aktuell mal wieder vor dem Problem der deutschen Sprache ;)
    Aktuell bin ich etwas am verzweifeln, denn egal wie ich es mache, es ist immer das falsche Ergebnis.

    Hier mal meine Funktion:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function load_gdt() As String
    2. If File.Exists(Path.Combine(My.Settings.gdt_pfad, My.Settings.gdt_datei)) Then
    3. System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)
    4. Dim objReader As New StreamReader(Path.Combine(My.Settings.gdt_pfad, My.Settings.gdt_datei), System.Text.UTF8Encoding.Default)
    5. 'Dim objReader As New StreamReader(Path.Combine(My.Settings.gdt_pfad, My.Settings.gdt_datei), Encoding.GetEncoding("CP852"))
    6. 'Dim objReader As New StreamReader(Path.Combine(My.Settings.gdt_pfad, My.Settings.gdt_datei), System.Text.Encoding.GetEncoding(1252))
    7. Dim sLine As String = ""
    8. Dim arrText As New ArrayList()
    9. Do
    10. sLine = objReader.ReadLine()
    11. If Not sLine Is Nothing Then
    12. arrText.Add(sLine)
    13. End If
    14. Loop Until sLine Is Nothing
    15. objReader.Close()
    16. For Each sLine In arrText
    17. Try
    18. 'PatID
    19. If sLine.Remove(0, 3).Remove(4, sLine.Length - 7).Contains("3000") Then
    20. tb_patid.Text = sLine.Remove(0, 7)
    21. End If
    22. 'Vorname
    23. If sLine.Remove(0, 3).Remove(4, sLine.Length - 7).Contains("3102") Then
    24. tb_vorname.Text = sLine.Remove(0, 7)
    25. End If
    26. 'Nachname
    27. If sLine.Remove(0, 3).Remove(4, sLine.Length - 7).Contains("3101") Then
    28. tb_nachname.Text = sLine.Remove(0, 7)
    29. End If
    30. 'Geburtsdatum
    31. If sLine.Remove(0, 3).Remove(4, sLine.Length - 7).Contains("3103") Then
    32. tb_gebdatum.Text = sLine.Remove(0, 7)
    33. End If
    34. 'PLZ / Ort
    35. If sLine.Remove(0, 3).Remove(4, sLine.Length - 7).Contains("3106") Then
    36. Dim plz As String = sLine.Remove(0, 7)
    37. Dim ort As String = sLine.Remove(0, 13)
    38. plz = plz.Remove(5)
    39. tb_plz.Text = plz
    40. tb_ort.Text = ort
    41. End If
    42. 'strasse
    43. If sLine.Remove(0, 3).Remove(4, sLine.Length - 7).Contains("3107") Then
    44. tb_strasse.Text = sLine.Remove(0, 7)
    45. End If
    46. 'Telefon
    47. Dim vorwahlen4() As String = {"0160", "0162", "0163", "0170", "0171", "0172", "0173", "0174", "0175", "0176", "0177", "0178", "0179"}
    48. Dim vorwahlen5() As String = {"01511", "01512", "01514", "01515", "01516", "01517", "01520", "01521", "01523", "01525", "01529", "01570", "01573", "01575", "01577", "01578", "01579", "01590"}
    49. Dim vorwahlen6() As String = {"015566", "015630", "015678", "015888"}
    50. If sLine.Remove(0, 3).Remove(4, sLine.Length - 7).Contains("3150") Then
    51. If vorwahlen4.Any(Function(b) sLine.Remove(0, 7).StartsWith(b)) Then
    52. tb_mobil.Text = sLine.Remove(0, 7).Replace(" ", "").Replace("/", "").Replace("-", "")
    53. Else
    54. tb_telefon.Text = sLine.Remove(0, 7).Replace(" ", "").Replace("/", "").Replace("-", "")
    55. End If
    56. If vorwahlen5.Any(Function(b) sLine.Remove(0, 7).StartsWith(b)) Then
    57. tb_mobil.Text = sLine.Remove(0, 7).Replace(" ", "").Replace("/", "").Replace("-", "")
    58. Else
    59. tb_telefon.Text = sLine.Remove(0, 7).Replace(" ", "").Replace("/", "").Replace("-", "")
    60. End If
    61. If vorwahlen6.Any(Function(b) sLine.Remove(0, 7).StartsWith(b)) Then
    62. tb_mobil.Text = sLine.Remove(0, 7).Replace(" ", "").Replace("/", "").Replace("-", "")
    63. Else
    64. tb_telefon.Text = sLine.Remove(0, 7).Replace(" ", "").Replace("/", "").Replace("-", "")
    65. End If
    66. End If
    67. 'eMail
    68. If sLine.Remove(0, 3).Remove(4, sLine.Length - 7).Contains("3456") Then
    69. tb_email.Text = sLine.Remove(0, 7)
    70. End If
    71. Catch ex As Exception
    72. End Try
    73. Next
    74. If My.Settings.gdt_autodel = True Then
    75. Try
    76. File.Delete(Path.Combine(My.Settings.gdt_pfad, My.Settings.gdt_datei))
    77. Catch
    78. MsgBox("Kann die GDT-Datei nicht löschen!" & Path.Combine(My.Settings.gdt_pfad, My.Settings.gdt_datei))
    79. End Try
    80. End If
    81. Else
    82. lbl_gdt_not_found.Visible = True
    83. End If
    84. End Function


    Folgendes Szenario:
    Ich möchte 2 verschiedene Schnittstellen abfangen, grundsätzlich sollten beide die gleiche "Sprache" sprechen, tun sie leider nicht.

    Anbei mal 2 Screenshots mit der Encode Analyse


    Laut Notepad++ ist die Datei die funktioniert in UTF-8, die die nicht geht soll angeblich ANSI sein.
    Im normalen "Editor" sind beide Dateien ANSI und laut den Screenshots sind beide Dateien UTF-8

    Kann mir hier vielleicht jemand bei helfen?

    Grüße SaMsOn
    Nein! Doch! OHH!
    Und was kommt raus, wenn Du beide Dateien entsprechend lädst?

    VB.NET-Quellcode

    1. Dim Kompletttext1 = IO.File.ReadAllText(PfadZuEinerDatei, System.Text.Encoding.Default) '= ANSI
    2. Dim Kompletttext2 = IO.File.ReadAllText(PfadZuEinerDatei, System.Text.Encoding.UTF8) '= UTF8


    ##########

    Habe zwar von Codeproject das hier abgekupfert

    VB.NET-Quellcode

    1. Private Function GetEncodingOf(FilePath As String) As System.Text.Encoding
    2. Using StreamReader As New IO.StreamReader(FilePath)
    3. If StreamReader.Peek() = -1 Then Throw New ArgumentException($"Die Datei {FilePath} scheint leer zu sein, ein Encoding kann daher (so) nicht ermittelt werden.")
    4. StreamReader.Read()
    5. Return StreamReader.CurrentEncoding
    6. End Using
    7. End Function
    musste aber feststellen, dass ich mit der jetzigen Win10-Version weder mit notepad noch notepad++ ANSI-Dateien erstellen kann. Auf stackoverflow gibt es zwar einen Hinweis, die entsprechende Windows-Einstellung ist bei mir jedoch nicht aktiv. schon auch eine Datei mit passendem Inhalt erstellen muss, damit ich das als ANSI speichern kann :S
    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“ ()

    @VaporiZed
    Danke für den Tipp. Mein Problem ist, das ich nicht weiss welche Software, welches Dateiformat liefert.
    Kurzum. Die "export.gdt" wird von einem Arzt Informations System (AIS) ausgegeben.
    GDT sollte eigentlich ein Standard sein, ist es aber nicht.
    Ich hab 2 Verschiedene AIS auf meinem PC installiert, mit dem einen gehts, mit dem anderen nicht.
    Mein "Konnektor" soll jedoch "Multi-Kompatibel" sein...

    Und nun steh ich da... :D
    Nein! Doch! OHH!
    Ich hab jetzt keine gute Lösung parat, aber vielleicht reicht es schon, wenn Du prüfst, ob der Text eines von den Zeichen äöüÄÖÜß enthält. Dann wär das verwendete Import-Encoding vermutlich richtig.
    Oder Du kopierst Dir dieses Sonder<?> und schaust, ob das in den importierten Texten enthalten ist. Dann ist das Encoding definitiv falsch.
    Aber ich weiß nicht, ob alle <?> da identisch sind. Musst Du prüfen.
    Kannst Du Testdateien hochladen?
    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.
    also kann man sagen, das Problem sind TextDateien, von denen das Encoding nicht bekannt ist?
    Da könnte man in zwei Schritten vorgehen:
    Vorzugsweise wertet man das BOM aus.
    Der von VPZ verlinkte CodeProject-Code tut das - VPZs Übertragung ist übrigens deutlich fehlerhaltiger als die CP-Vorlage.
    Wenn kein BOM vorhanden ist, liefert der CodeProject-Code Encoding.DEfault (=ANSI).
    Das ist meistens richtig, aber nicht immer.
    Ist kein BOM vorhanden muss man heuristisch vorgehen - also raten.

    Hier ein CP-Artikel, der scheinbar die "Encoding-Heuristik-Engine" des Internet-Explorers verwendet: codeproject.com/Articles/17201…-for-In-and-Outgoing-Text
    Ich hab auf CP auch mal einen Artikel gefunden, der eine Heuristik als Source veröfflicht.
    find ich grad nicht wieder, war auch sehr aufwändig.