Unicode dekodieren - Funktion vorhanden?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Unicode dekodieren - Funktion vorhanden?

    Hallo,

    ich arbeite mit einem String der bei Sonderzeichen Unicode verwende:

    Quellcode

    1. Das\nk\u00f6nnte ein Beispiel sein\n500\u20ac = viel Spa\u00df!


    bedeutet:

    Quellcode

    1. Das
    2. könnte ein Beispiel sein
    3. 500€ = viel Spaß!



    Was ich brauche ist eine Funktion, die einen String wie oben in einen String wie unten umwandelt.
    Ich könnte natürlich eine Funktion bastel die diese Struktur hat:

    Quellcode

    1. Return input.Replace("\n", vbNewLine).Replace("\u00f6", "ö").Replace("\u00fc", "ü").Repl....


    aber da werde ich sicherlich das ein oder andere Zeichen vergessen. Ich weiß nämlich auch nicht, welche "Sonderzeichen" in Unicode umgewandelt wurden. Das Ausrufezeichen wird ja zum Beispiel nicht kodiert, dafür aber das Euro-Zeichen.
    Gibt es dafür vielleicht schon eine Funktion in der Encoding-Klasse?

    Danke!

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

    Meinst du vielleicht sowas? (Achtung C#, aber kannst ja ganz easy porten.)

    C#-Quellcode

    1. string foo = @"Das\nk\u00f6nnte ein Beispiel sein\n500\u20ac = viel Spa\u00df!";
    2. string bar = System.Text.RegularExpressions.Regex.Unescape(foo);
    3. Console.WriteLine(foo);
    4. Console.WriteLine(bar);
    5. Console.ReadLine();


    Edit: Editier die Fragestellung wieder rein damit andere die Frage verstehen und dann die Antwort darauf finden können.
    Hi
    am einfachsten wäre es vermutlich, das einfach Zeichen für Zeichen durchzugehen:

    VB.NET-Quellcode

    1. Shared Function Decode(s As String) As String
    2. Dim sb As StringBuilder = Nothing
    3. Dim i As Integer = 0
    4. Dim mark As Integer = 0
    5. Dim l As Integer = s.Length
    6. While i < l
    7. Dim cc As Char = s(i)
    8. If cc = "\"c Then
    9. If sb Is Nothing Then sb = New StringBuilder()
    10. If i <> mark Then sb.Append(s, mark, i - mark)
    11. i += 1
    12. If i >= l Then Throw New ArgumentException("Unexpected end of input.", NameOf(s))
    13. cc = s(i)
    14. If cc = "n"c Then
    15. sb.Append(vbLf)
    16. ElseIf cc = "r" Then
    17. sb.Append(vbCr)
    18. ElseIf cc = "\"c Then
    19. sb.Append("\"c)
    20. ElseIf cc = "t" Then
    21. sb.Append(vbTab)
    22. ElseIf cc = "u"c Then
    23. i += 1
    24. sb.Append(DecodeChar(s, i, 4))
    25. i += 3
    26. '...
    27. End If
    28. i += 1
    29. mark = i
    30. Else
    31. i += 1
    32. End If
    33. End While
    34. If sb Is Nothing Then Return s
    35. If i <> mark Then sb.Append(s, mark, i - mark)
    36. Return sb.ToString()
    37. End Function
    38. Private Shared Function DecodeChar(s As String, index As Integer, length As Integer) As Char
    39. If index + length > s.Length Then Throw New ArgumentException("Unexpected end of input.", NameOf(s))
    40. Dim v As Integer = 0
    41. For i As Integer = index To index + length - 1
    42. Dim cc As Char = s(i)
    43. If cc >= "0"c AndAlso cc <= "9"c Then
    44. v = v * 16 + (Asc(cc) - Asc("0"c))
    45. ElseIf cc >= "A"c AndAlso cc <= "F"c Then
    46. v = v * 16 + (Asc(cc) - Asc("A"c) + 10)
    47. ElseIf cc >= "a"c AndAlso cc <= "f"c Then
    48. v = v * 16 + (Asc(cc) - Asc("a"c) + 10)
    49. Else
    50. Throw New ArgumentException("Unexpected hex character detected.", NameOf(s))
    51. End If
    52. Next
    53. Return Chr(v)
    54. End Function


    Die Idee ist, solange alle Buchstaben durchzugehen, bis das Ende erreicht wurde und zu überprüfen, ob es sich um den Buchstaben "\" handelt. Wenn, dann wird überprüft, ob das darauffolgende Zeichen n, u, t, usw. ist und entsprechender Code ausgeführt.
    @jmj
    Ich hätte geschätzt, dass das nicht ganz klappt, weil Regex noch ein wenig mehr unterstützt, als nur das Escaping von solchen Buchstaben.

    Viele Grüße
    ~blaze~
    @~blaze~ ich hab das mal mit dem String von @jmj probiert, da kommt mit dem Input \u20ac eine ArgumentException bei Return Chr(v).

    Kann es sein, dass da so was wie eine CodePage (0x20) ausgelesen werden muss?
    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!

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

    @~blaze~ Jou, so isses.
    @jmj Ich gebe in jedem Falle Deiner Methode den Vorzug. :thumbup:
    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!
    @~blaze~ Ich hab da eben noch mal reingesehen, die Konvertierung der einzelnen Zeichen ist doch etwas oversized, .NET kann das doch:

    VB.NET-Quellcode

    1. Private Shared Function DecodeChar(s As String, index As Integer, length As Integer) As Char
    2. If index + length > s.Length Then Throw New ArgumentException("Unexpected end of input.", NameOf(s))
    3. Dim ss = s.Substring(index, length)
    4. Dim v2 = Convert.ToInt32(ss, 16)
    5. Return ChrW(v2)
    6. End Function
    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!