none
VB6 zu VB.net; zwei Probleme mit Funktionen RRS feed

  • Frage

  • Hallo zusammen,
    ich habe aus dem Netz eine Funktion geladen, die in VB6 geschrieben ist:

    	'Purpose: Convert Utf8 to Unicode
    	Public Function UTF8_Decode(sUTF8 As String) As String
    		Dim lngUtf8Size, lngBufferSize, lngResult, n As Long, strBuffer As String
    		Dim bytUtf8() As Byte
    		If LenB(sUTF8) Then
    			'If System.Text.Encoding.Unicode.GetByteCount(myString) Then
    			On Error GoTo EndFunction
    			bytUtf8 = StrConv(sUTF8, vbFromUnicode)
    			lngUtf8Size = UBound(bytUtf8) + 1
    			On Error GoTo 0
    			'Set buffer for longest possible string i.e. each byte is
    			'ANSI<=&HFF, thus 1 unicode(2 bytes)for every utf-8 character.
    			lngBufferSize = lngUtf8Size * 2
    			'strBuffer = String$(lngBufferSize, vbNullChar)
    			strBuffer = New String(vbNullChar, lngBufferSize)
    			'Translate using code page 65001(UTF-8)
    			lngResult = MultiByteToWideChar(CP_UTF8, 0, bytUtf8(0),
    			lngUtf8Size, StrPtr(strBuffer), lngBufferSize)
    			'Trim result to actual length
    			If lngResult Then
    				UTF8_Decode = Left$(strBuffer, lngResult)
    				'Debug.Print UTF8_Decode
    			End If
    		End If
    EndFunction:
    	End Function
    

    Diese habe ich nun versucht in VB.net einzusetzen. dabei erhalte ich allerdings zwei Fehler-Kennzeichnungen in den Zeilen:

    1.             bytUtf8 = StrConv(sUTF8, vbFromUnicode)   die Funktion StrConv existiert anscheinend nicht in Vb.net

    2.             lngResult = MultiByteToWideChar(CP_UTF8, 0, bytUtf8(0), lngUtf8Size, StrPtr(strBuffer), lngBufferSize)    dasselbe Problem mit nicht existenter Funktion

    Kann mir jemand einen Tipp geben, wie man diese Funktionen ersetzen kann?

    Grüße-


    Dietrich

    Donnerstag, 15. März 2018 16:33

Antworten

  • Hallo Dietrich,

    und was willst Du mit der Methode machen? UTF-8 in Unicode wandeln?

    Bedenke, dass .NET vieles, was man früher selbst irgendwie zusammenbasteln musste, nun von Haus aus enthält. So AFAICS bspw. auch das, was diese Methode macht.

    Dim x As String
        x = Encoding.Unicode.GetString( Encoding.Convert( Encoding.UTF8, Encoding.Unicode, Encoding.UTF8.GetBytes( "Dein UTF-8 String" ) ) )



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community




    Donnerstag, 15. März 2018 16:41
    Moderator
  • Hallo Dietrich,

    wie in dem anderen Thread bereits festgestellt gibt es anscheinend erhebliche Unterschiede zwischen deinem System und anderen Systemen. Trotz des gleichen Fonts (zumindest lt. Fonteigenschaften) sehen die Zeichen bei mir auf verschiedenen PCs (Windows 8.1, Windows 10) dennoch komplett anders aus als bei dir.

    Klar kann man Multibyte-Zeichen nicht durch auslesen jeweils eines einzelnen Bytes korrekt extrahieren.

    Ich würde dir diesen MSDN Artikel mal ans Herz legen, der könnte das Verständnis für solche Aktionen, Zeichensätze, ... doch verbessern (hat er bei mir doch etwas, denke ich zumindest^^)

      https://docs.microsoft.com/de-de/dotnet/standard/base-types/character-encoding

    Falls Encoding.<Encoding>.GetChars dir nicht weiterhilft, schau dir evtl. auch mal Decoder.GetChars an.

    Ich bin kein Experte, was Zeichenfolgencodierung, Transformation derselben, usw. angeht. Daher müsste bei weiteren Fragen auf diesem Gebiet jemand anders einspringen. Ich hoffe aber mal, dass Du damit zurecht kommst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 17. März 2018 09:15
    Moderator

Alle Antworten

  • Hallo Dietrich,

    und was willst Du mit der Methode machen? UTF-8 in Unicode wandeln?

    Bedenke, dass .NET vieles, was man früher selbst irgendwie zusammenbasteln musste, nun von Haus aus enthält. So AFAICS bspw. auch das, was diese Methode macht.

    Dim x As String
        x = Encoding.Unicode.GetString( Encoding.Convert( Encoding.UTF8, Encoding.Unicode, Encoding.UTF8.GetBytes( "Dein UTF-8 String" ) ) )



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community




    Donnerstag, 15. März 2018 16:41
    Moderator
  • Hallo Stefan, danke für den Tipp!

    Nun, ich lade mir halt Code herunter, der zu einem speziellen Thema passen könnte.
    Dabei stelle ich fest, dass oft keinerlei Beschreibung der Arbeitsweise dabei ist, sodass man sich vieles nur selbst gedanklich nachvollziehen muss...

    Primär werde ich wohl den VB6-Code in VBA verwenden. Das Einbringen in VB.net habe ich gewissermaßen nur so aus Interesse gemacht.

    Werde deinen Tipp natürlich ausprobieren...!

    Grüße-


    Dietrich

    Donnerstag, 15. März 2018 17:11
  • Hallo Stefan, habs probiert und funktioniert. Danke!

    Stellt sich die Frage, kann man dann mit einfachem Substring-Befehl auf ein einzelnes Zeichen zugreifen?

    z= x.Substring(13, 1) bspw. 14.Zeichen der Länge 1 und dann mittels Hex(AscW(z)) den HexCode des Zeichens ermitteln?

    Grüße-


    Dietrich

    Freitag, 16. März 2018 08:23
  • Hallo Dietrich,

    es würde echt helfen, wenn Du mal erklärst, was genau Du vorhast.

    Klar kann man mit Substring auf die Zeichen zugreifen. Aber auch mit der String.Chars Auflistung oder auf anderem Wege.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 16. März 2018 08:38
    Moderator
  • Hallo Stefan,
    also in einem früheren Post hatte ich das Thema schon mal angesprochen, allerdings unter VBA.

    Es geht darum, aus einer Reihe (String) Emojis (via Segoe Font) die Hexcodes der code points für jedes einzelne Zeichen zu ermitteln. Diese Emojis können ja aus 1-6 code points bestehen. Mittels der Hexcodes ist es mir dann möglich, einen Filenamen zusammen zu setzen, der auf die Grafik eines Emojis verweist (in meiner Sammlung derzeit ca. 2400).

    Beispiel:

    1f468-1f3fb-200d-2695-fe0f   man health worker: light skin tone

    Grüße-


    Dietrich

    Freitag, 16. März 2018 09:24
  • Eine Ergänzung:

    Das Bild zeigt ein paar Emojis im SegoeEmoji-Code, und zwar in einer VB.net-Textbox.
    Wenn man nun den Textcursor in die Box setzt und dann mittels Pfeil-rechts Taste vorwärts geht, bemerkt man, dass der Cursor bei manchem Zeichen nicht weiter rückt, sondern man muss 2-3 oder gar 4 mal die Taste drücken, allerdings nicht sichtbar. Erst nach diesen "Zwischenschritten" kommt der Cursor beim nächsten sichtbaren Zeichen an...

    Es sind 42 Zeichen, aber wenn man Textbox.TextLength anwendet kommt 166 heraus. Das zeigt eigentlich, dass man die "echten" Zeichen nicht mit Substring(x,1) oder String.Chars(1) extrahieren kann, meine ich. Und das ist das Problem... AscW bringt dann nämlich nichts.

    Grüße-


    Dietrich




    • Bearbeitet dherrmann Samstag, 17. März 2018 09:56
    Samstag, 17. März 2018 08:55
  • Hallo Dietrich,

    wie in dem anderen Thread bereits festgestellt gibt es anscheinend erhebliche Unterschiede zwischen deinem System und anderen Systemen. Trotz des gleichen Fonts (zumindest lt. Fonteigenschaften) sehen die Zeichen bei mir auf verschiedenen PCs (Windows 8.1, Windows 10) dennoch komplett anders aus als bei dir.

    Klar kann man Multibyte-Zeichen nicht durch auslesen jeweils eines einzelnen Bytes korrekt extrahieren.

    Ich würde dir diesen MSDN Artikel mal ans Herz legen, der könnte das Verständnis für solche Aktionen, Zeichensätze, ... doch verbessern (hat er bei mir doch etwas, denke ich zumindest^^)

      https://docs.microsoft.com/de-de/dotnet/standard/base-types/character-encoding

    Falls Encoding.<Encoding>.GetChars dir nicht weiterhilft, schau dir evtl. auch mal Decoder.GetChars an.

    Ich bin kein Experte, was Zeichenfolgencodierung, Transformation derselben, usw. angeht. Daher müsste bei weiteren Fragen auf diesem Gebiet jemand anders einspringen. Ich hoffe aber mal, dass Du damit zurecht kommst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 17. März 2018 09:15
    Moderator
  • Danke für deine Tipps, Stefan!

    das verstehe ich nicht, dass die Zeichen bei dir vollkommen anders aussehen ... unklar.

    Ich kann mir nicht denken, was an meinem System so anders sein soll.: PC Lenovo, Windows 10 pro (1709) mit VisualStudio2017 Version 15.6.2, MS NetFramework Version 4.7.02556.

    Natürlich werde ich mal die Links besuchen...

    Grüße-


    Dietrich

    Samstag, 17. März 2018 10:18