Benutzer mit den meisten Antworten
VB6 zu VB.net; zwei Probleme mit Funktionen

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
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
- Bearbeitet Stefan FalzModerator Donnerstag, 15. März 2018 16:47
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 26. März 2018 13:31
- Als Antwort markiert Stefan FalzModerator Samstag, 31. März 2018 18:48
-
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- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 26. März 2018 13:32
- Als Antwort markiert Stefan FalzModerator Samstag, 31. März 2018 18:48
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
- Bearbeitet Stefan FalzModerator Donnerstag, 15. März 2018 16:47
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 26. März 2018 13:31
- Als Antwort markiert Stefan FalzModerator Samstag, 31. März 2018 18:48
-
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
-
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
-
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 -
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
-
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
-
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- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 26. März 2018 13:32
- Als Antwort markiert Stefan FalzModerator Samstag, 31. März 2018 18:48
-
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