VISUAL STUDIO e confronto stringhe

di il
4 risposte

VISUAL STUDIO e confronto stringhe

Buongiorno,

sto scrivendo un programma in VB Net  che utilizza SQLite3 come database; il DB viene creato regolarmente, con tabelle e dati.

Il problema sorge quando devo cercare un record: anche se la chiave è identica non match perchè il db è in codifica UTF-8 e Visual studio di default è in UTF-16.

Come faccio a dire a Visual studio che deve codificare  in UTF-8 o in alternativa, come creare il DB con codifica UTF-16?

Private Function TestExistMacro(tempcod As String) As Boolean
        Dim Nome As String, Iden As Integer
       
        Nome = " "
        Try
            Using connessione As New SQLiteConnection(ConnString)
                connessione.Open()
                
                Dim Query As String = "SELECT * FROM Tmacro;"
                Using comando As New SQLiteCommand(Query, connessione)
                
                    Using Leggi As SQLiteDataReader = comando.ExecuteReader
                        While Leggi.Read()
                            Iden = Leggi.GetInt32(0)
                            Nome = Leggi.GetString(1)
                            If Nome Is Nothing Then
                                Continue While
                            End If
                            If Nome = tempcod Then
                                Return True
                                Exit Function
                            End If
                        End While

                        If Nome Is Nothing Or Nome IsNot tempcod Then
                            Return False
                            Exit Function
                        End If
                    End Using
                End Using
            End Using
            Return True
        Catch ex As Exception
            MsgBox("Impossibile leggere il database: " & ex.Message)
            Return False
            Exit Function
        End Try
        Return True
    End Function

4 Risposte

  • Re: VISUAL STUDIO e confronto stringhe

    Https://learn.microsoft.com/it-it/dotnet/standard/base-types/character-encoding

  • Re: VISUAL STUDIO e confronto stringhe

    Buongiorno Oregon

    Ho esaminato il link che mi hai dato e ho fatto delle prove inserendolo in un form. Ecco il listato della routine

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Dim strings() As String = {"This is the first sentence. ",
        '                          "This is the second sentence. "}
        Dim strings(2) As String
    
        Dim utf16Encoding As Encoding = Encoding.Unicode
        ListBox1.Items.Clear()
    
        ' Create array of adequate size.
        Dim bytes(50) As Byte
        ' Create index for current position of array.
        Dim index As Integer = 0
        strings(0) = TextBox1.Text
    
        ListBox1.Items.Add("Strings to encode:")
        For Each stringValue In strings
            If stringValue Is Nothing Then Continue For
            ListBox1.Items.Add("            " & stringValue)
    
            Dim count As Integer = utf16Encoding.GetByteCount(stringValue)
            If count + index >= bytes.Length Then
                Array.Resize(bytes, bytes.Length + 50)
            End If
            Dim written As Integer = utf16Encoding.GetBytes(stringValue, 0, stringValue.Length, bytes, index)
    
            index += written
        Next
        'Console.WriteLine()
        ListBox1.Items.Add("Encoded bytes:")
        Dim vshow As String = ShowByteValues(bytes, index)
        ListBox1.Items.Add("          " & vshow)
        'Console.WriteLine()
    
        ' Decode Unicode byte array to a string.
        Dim asciiEncoding As Encoding = Encoding.UTF8
        Dim newString As String = asciiEncoding.GetString(bytes, 0, index)
        Dim NormString As String = NormalizzaString(bytes, index)
        Label1.Text = NormString
        'Console.WriteLine("Decoded: {0}", newString)
    End Sub
    Private Function ShowByteValues(bytes As Byte(), last As Integer) As String
        Dim returnString As String = "   "
        For ctr As Integer = 0 To last - 1
            If ctr Mod 20 = 0 Then returnString += vbCrLf + "   "
            returnString += String.Format("{0:X2} ", bytes(ctr))
        Next
        Return returnString
    End Function
    Private Function NormalizzaString(bytes As Byte(), last As Integer) As String
        Dim NormString As String = "", num As Integer
        For ctr As Integer = 0 To last - 1 Step 2
            num = bytes(ctr)
            'If ctr Mod 20 = 0 Then returnString += vbCrLf + "   "
            NormString += Chr(num)
        Next
        Return NormString
    
    End Function

    La stringa di partenza è in UTF-16   e ho cambiato la riga iniziale

     Dim utf16Encoding As Encoding = Encoding.Unicode

    la riga è ABCDEFGH

    la decodifica deve avvenire in UTF-8 

    Dim asciiEncoding As Encoding = Encoding.UTF8

    l'istruzione:  Dim newString As String = asciiEncoding.GetString(bytes, 0, index)

    fornisce una stringa con le lettere da me digitate accompagnate da un vbnull ciascuna

    Come Mai?

    Ho creato una funzione di prova che mi toglie il  vbnull ma è un accrocco temporaneo

    Private Function NormalizzaString(bytes As Byte(), last As Integer) As String
        Dim NormString As String = "", num As Integer
        For ctr As Integer = 0 To last - 1 Step 2
            num = bytes(ctr)
            NormString += Chr(num)
        Next
        Return NormString
    
    End Function

    grazie per l'attenzione 

    Franco

  • Re: VISUAL STUDIO e confronto stringhe

    Ciao, ci sono alcuni errori, dall'Array all'Encoding....

    Per esempio verifica questi passaggi:

    Imports System.Text
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim utf16Encoding As Encoding = Encoding.Unicode ' utf-16 encoding (default in vb.net)
        Dim utf8Encoding As Encoding = Encoding.UTF8 ' utf-8 encoding (sqlite standard)
    
        ListBox1.Items.Clear()
    
        ' get text from textbox
        Dim inputString As String = TextBox1.Text
    
        ' convert utf-16 string to utf-8 byte array
        Dim utf8Bytes As Byte() = utf8Encoding.GetBytes(inputString)
    
        ' display original string
        ListBox1.Items.Add("original string:")
        ListBox1.Items.Add("   " & inputString)
    
        ' display encoded bytes
        ListBox1.Items.Add("utf-8 encoded bytes:")
        ListBox1.Items.Add("   " & ShowByteValues(utf8Bytes, utf8Bytes.Length))
    
        ' decode utf-8 byte array back to utf-16 string
        Dim decodedString As String = utf8Encoding.GetString(utf8Bytes)
    
        ' display decoded string
        Label1.Text = decodedString
        ListBox1.Items.Add("decoded string:")
        ListBox1.Items.Add("   " & decodedString)
    End Sub
    
    ' function to display byte values as hex
    Private Function ShowByteValues(bytes As Byte(), length As Integer) As String
        Dim returnString As String = ""
        For ctr As Integer = 0 To length - 1
            If ctr Mod 20 = 0 Then returnString += vbCrLf + "   "
            returnString += String.Format("{0:X2} ", bytes(ctr))
        Next
        Return returnString
    End Function
    
    • il For Each lo dovrai inserire se vuoi elaborare più stringhe. In questo caso vedo che ne elabori una sola e quindi l'ho tolto.
    • L'array bytes conteneva dati in formato UTF-16 e lo leggevi come un UTF-8. Questo genera l'errore che riscontri con la presenza dei caratteri Null
  • Re: VISUAL STUDIO e confronto stringhe

    Perfetto By65Franco, ti ringrazio adesso funziona tutto

    Grazie a tutti   Franco

Devi accedere o registrarti per scrivere nel forum
4 risposte