UTF8 (?) konvertieren

  • VB.NET

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

    UTF8 (?) konvertieren

    Hallo Leute,
    finden zu folgendem problem keine lösung:
    also ich habe einen string, wenn ich ihn anzeigen lasse werden die umlaute etc. falsch dargestellt: zb statt einem "ü" ein "ü". Wenn ich richtig informiert bin, ist das dann doch UTF8?
    ok, also diesen string will ich umwandeln, sodass wieder alle zeichen richtig angezeigt werden.
    habe schon alles möglich probiert (system.text.encoding,...), alle variationen, aber es kommt trotzdem nie das richtige raus, im bestenfall kommt noch statt dem "ü" ein "??".
    kann mir bitte jemand helfen wie ich das endlich richtig konvertieren kann (unicode ?( )?

    danke für eure hilfe
    Danke für die Antwort.
    Ich lese Text aus dem clipboard mit getdata(dataformats.Text/rtf/html). Bei jedem Format ist der eingelesene String dann wie oben beschrieben. Wenn ich einen text normal mit Strg + v einfüge bleibn die Zeichen erhalten.
    hat denn keiner eine idee? es muss doch eine lösung geben :( ...

    ps. zur ergänzung:
    wenn ich nur einfachen text ins clipboard kopiert habe und als DataFormats.text einlese, ist der ok.
    wenn ich einen rtf-text ins cp kopiert habe, ist der eingelesene DataFormats.text fehlerhaft, aber der eingelesene DataFormats.rtf fehlerfrei.
    wenn ich html ins cp kopiert habe, ist DataFormats.text, DataFormats.rtf und DataFormats.html fehlerhaft.
    hmm, für .NET ist der vorgeschlagene MSDN Code für die Clipboard Klasse

    VB.NET-Quellcode

    1. ' Declares an IDataObject to hold the data returned from the clipboard.
    2. ' Retrieves the data from the clipboard.
    3. Dim iData As IDataObject = Clipboard.GetDataObject()
    4. ' Determines whether the data is in a format you can use.
    5. If iData.GetDataPresent(DataFormats.Text) Then
    6. ' Yes it is, so display it in a text box.
    7. TextBox1.Text = CType(iData.GetData(DataFormats.Text), String)
    8. Else
    9. ' No it is not.
    10. TextBox1.Text = "Could not retrieve data off the clipboard."
    11. End If

    Und das funktioniert nicht ?
    Tut mir leid, ich kann nur Deinen Fehler einfach nicht nachstellen, das ist alles.

    Egal ob ich aus einer WebSeite, aus Wordpad (rtf) oder sonstwoher Text mit Ctrl+C kopiere, dieser Code bringt mir immer fehlerfrei den reinen Text inclusive Umlaute
    ok, vlt. hab ich mich nicht ganz klar ausgedrückt.
    also: stimmt, du hast teilweise recht. kopiere ich ein html mit umlauten und lese es dann mit

    VB.NET-Quellcode

    1. TextBox1.Text = CType(Clipboard.GetData(DataFormats.Text), String)

    aus, wird das umlaut richtig angezeigt. ABER:
    lese ich mit

    VB.NET-Quellcode

    1. TextBox1.Text = CType(Clipboard.GetData(DataFormats.HTML), String)

    aus, dann nicht! angenommen ich kopiere das wort "über" aus einer internetseite. dann wird der html-code im clipboard wohl in etwa so aussehen:

    VB.NET-Quellcode

    1. <html><body>...
    2. über
    3. </body></html>

    aber in TextBox1 steht dann:

    VB.NET-Quellcode

    1. <html><body>...
    2. über
    3. </body></html>



    probiere es zb so aus:

    führe einmal mit einem plaintext, einmal mit einem rtf und einmal mit einem html im zwischenspeicher jeweils folgendes aus:

    VB.NET-Quellcode

    1. MsgBox(CType(Clipboard.GetData(DataFormats.text), String))
    2. richtextbox.rtf = (CType(Clipboard.GetData(DataFormats.RTF), String))
    3. MsgBox(CType(Clipboard.GetData(DataFormats.HTML), String))

    hast du nur einen text "über" kopiert, kommt "über" in der ersten Msgbox (rtf ung html wird wohl ins leere laufen)
    hast du einen RTF "über" kopiert (aber nicht aus word, das wird auch als html kopiert - zb aus dem vb code-editor), kommt "über" in der ersten Msgbox; in der Richtextbox wird richtig "über" dargestellt.
    hast du ein html "über" kopiert, kommt "über" in der ersten Msgbox; in der Richtextbox wir auch richti "über" stehen, aber in der 3. MsgBox wird so etwas wie

    VB.NET-Quellcode

    1. <html><body>...
    2. über
    3. </body></html>

    stehen.

    ich brauche aber alles mir richtigen sonderzeichen. ich will zb. den html code später wieder ins clipboard einfügen und dann in word einfügen. wenn ich das "normal" mache ("über" in ie kopieren - in word einfügen) steht im word "über".

    wenn ich Clipboard.GetData(DataFormats.HTML) in einen string einlesen, diesen string dem clipboard später wieder zuweise und dann in word strg-v mache, steht dort "über" - da ja bereits der in string eingelesene quellcode das falsche "über" enthält.
    Ok, denke ich habs halbwegs verstanden und werd's mal in einer stillen Minute ( oder Stunde *hust*) nachstellen.

    Dein zitiertes "ü" ist halt wie Du schon selber bemerkt hast UTF8 Code in ASCII / ANSI dargestellt. Nur da Strings in .NET grundsätzlich selber UTF8 sind, wurde im Original als Unicode encodeter Text als ASCII gelesen und dann intern im String als UTF8 gespeichert.

    Da macht es schon Sinn nachzufragen ob man das übel nicht am Besten beim Einlesen anpackt . Der einzige Weg der vielleicht Erfolg verspricht ist der Weg über Byte-Arrays ( String -> Bytearray -> encoding convertieren -> String).

    Aber dazu muss man es halt erst einmal nachstellen können.
    danke für deine hilfe ...
    ja sowas ähnliches hab ich mir ja auch schon gedacht, hab aber keine ahnung wie ich das ganze jetzt genau machen müsste.
    habe es zb. mit diesem code aus dem internet probiert, in allen möglichen quell-/zielformat-kombinationen und hintereinander:

    VB.NET-Quellcode

    1. Shared Function Convert(ByVal sourceString As String)
    2. ' Create two different encodings.
    3. Dim targetEncoding As Encoding = Encoding.Default
    4. Dim sourceEncoding As Encoding = Encoding.UTF8
    5. ' Convert the string into a byte[].
    6. Dim sourceBytes As Byte() = sourceEncoding.GetBytes(sourceString)
    7. ' Perform the conversion from one encoding to the other.
    8. Dim targetBytes As Byte() = Encoding.Convert(sourceEncoding, targetEncoding, sourceBytes)
    9. ' Convert the new byte[] into a char[] and then into a string.
    10. ' This is a slightly different approach to converting to illustrate
    11. ' the use of GetCharCount/GetChars.
    12. Dim targetChars(targetEncoding.GetCharCount(targetBytes, 0, targetBytes.Length)) As Char
    13. targetEncoding.GetChars(targetBytes, 0, targetBytes.Length, targetChars, 0)
    14. Dim targetString As New String(targetChars)
    15. ' Display the strings created before and after the conversion.
    16. MsgBox("Original string: {0}" & sourceString)
    17. MsgBox("Converted string: {0}" & targetString)
    18. Return targetString
    19. End Function


    kam aber nie was dabei raus außer manchmal "??" statt "ü".

    hoffentlich findet sich da noch eine lösung :S sonst wird mein projekt (ein clipboard-manager) ziemlich sinnlos :wacko:
    bei HTML solltest du für Umlaute wohl eher &auml; &ouml; usw. verwenden, oder die Eingangsdatei im entsprechenden Format speichern, bei RTF muss das auch nochmal anders gehen, wie weiß ich jetzt so nicht auswendig, aber ich hatte es hier im Forum auch mal geschrieben...

    hier: [VB 2008] system.io.streamwriter Selbstlaute Ä Ö Ü als komische Zeichen abgespeichert
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    jvbsl:
    ja kann schon sein dass es besser wäre in einer html, hat aber mit meinem problem nichts zu tun und sind auch nicht meine html-dateien.
    dein link mit dem zeichen-ersetzen: finde ich suboptimal und nicht guter stil, ich will ja richtig konvertiert haben, und vor allem auch alle sonderzeichen die es gibt, da ist mir dieses statische austauschen eig genau das was ich nicht will.

    kangaroo:
    ich bin mal so frei und hänge ein beispiel-projekt an um mein problem nachstellen zu können.
    so brauch ich hier nicht alles umständlich/unverständlich erklären und man kann es mit ein paar klicks nachvollziehen.

    ich danke euch allen für die hilfe
    denn so langsam bin ich am verzweifeln :S
    Dateien
    • ProblemSample.zip

      (84,22 kB, 191 mal heruntergeladen, zuletzt: )
    moin

    Eine Lösung für diese Frage würde mir auch sehr weiterhelfen, mein Problem:

    Public Function XML_String_Funktion(ByVal XML_String As String) As String



    Dim test As New TeilnehmerlisteEDV

    Dim NAME_XMLDATEI As String = (Application.ExecutablePath & ".config")

    Dim XMLDoc As XElement

    XMLDoc = XElement.Load(NAME_XMLDATEI) ' XML-Datei einlesen

    Dim KnotenNamen As String = "connectionStrings" '"version"

    Dim NeuerWert As String = TeilnehmerlisteEDV.TextBox1.Text

    Dim KnotenListe = (From Eintragung In XMLDoc.Elements() _

    Where Eintragung.Name = KnotenNamen _

    Select Eintragung).First ' Den ersten gefundenen Knoten



    KnotenListe.SetValue(NeuerWert) ' Wert neu setzen



    XMLDoc.Save(NAME_XMLDATEI)

    MsgBox("OK-XMLDoc.Save(NAME_XMLDATEI)" & NAME_XMLDATEI)



    End Function



    Text ausgelesen aus der Datei Application.ExecutablePath & ".config" und in TextBox1 eingetragen, Connectstring in TextBox1 manuell ändern, wieder auslesen und Änderung in Datei speichern, ganz einfach 8-) .

    Dateicoding --> <?xml version="1.0" encoding="utf-8"?>

    Aus diesem Eintrag:

    <connectionStrings><add name="…" /></connectionStrings>

    Wird folgender:

    <connectionStrings>&lt;add name="…" /&gt;</connectionStrings>

    Und zwar passiert das hier bei dieser Operation:

    KnotenListe.SetValue(NeuerWert)



    Mir ist im Grunde völlig klar, warum das passiert, ABER wie kann ich dagegen an???
    Ich weiß wie alt der Thread ist. Ich schreibe hier nur weil ich eine Lösung für das identische Problem gesucht hatte.

    Das Problem tritt auf, wenn ein Programm in eine Datei mit ANSI (Windows-1252) kodiert ist Zeilen im UTF8 Format geschrieben werden.
    Leider muss ich auch solche "kaputten" Daten verarbeiten. Jede Datei vorher im Notepad++ umzukodieren ist mir dann aber doch zu blöd ;)

    Ich bezweifle, dass ich der Funktion den korrekten Namen gegeben habe, aber sie funktioniert.

    VB.NET-Quellcode

    1. Public Function Unicode2UTF8(ByVal strData As String) As String
    2. 'http://www.utf8-zeichentabelle.de/unicode-utf8-table.pl?number=512&names=-&utf8=char
    3. Unicode2UTF8 = String.Empty
    4. If strData <> String.Empty Then
    5. Dim bytes() As Byte
    6. bytes = Encoding.GetEncoding("Windows-1252").GetBytes(strData)
    7. Unicode2UTF8 = Encoding.UTF8.GetString(bytes)
    8. End If
    9. End Function