Differenze tra le versioni di "Individuare i valori costituenti i caratteri tipo UTF-8 di lettere localizzate"

Da Gambas-it.org - Wikipedia.
(Creata pagina con 'Come è noto, ogni carattere ASCII che ha un codice da 0 a 127 occupa un byte, invece set di caratteri come UTF-8 con lettere localizzate del tipo è, é, ù e simili richiedo...')
 
Riga 1: Riga 1:
Come è noto, ogni carattere ASCII che ha un codice da 0 a 127 occupa un byte, invece set di caratteri come UTF-8 con lettere localizzate del tipo è, é, ù e simili richiedono due o più caratteri.
+
Come è noto, ogni carattere ASCII che ha un codice da 0 a 127 occupa un byte, invece set di caratteri come UTF-8 con lettere ''localizzate'' del tipo ''è'', ''é'', ''ù'' e simili richiedono due o più valori del codice ASCII esteso.
  
E' possibile individuare i valori costituenti tali lettere localizzate mediante almeno quattro modalità.
+
E' possibile individuare tali valori costituenti le lettere ''localizzate'' mediante almeno quattro modalità.
  
  
Riga 35: Riga 35:
 
    
 
    
 
  '''End'''
 
  '''End'''
+
 
+
 
===Uso dei ''Puntatori'' e dei ''Memory Stream''===
+
===Uso dei ''Puntatori''===
Questa modalità è più complessa e prevede la lettura dell'area di memoria puntata dalla variabile stringa contenente la lettera localizzata:
+
Questa modalità prevede la lettura dell'area di memoria puntata dalla variabile stringa contenente la lettera localizzata:
 
  '''Public''' Sub Main()   
 
  '''Public''' Sub Main()   
 
    
 
    
Riga 44: Riga 44:
 
  ' ''mediante il suo assegnamento in una coerente variabile di tipo Stringa:''</font>
 
  ' ''mediante il suo assegnamento in una coerente variabile di tipo Stringa:''</font>
 
   Dim s As String = "è"   
 
   Dim s As String = "è"   
 
 
<FONT Color=gray>' ''Sappiamo che per operare con i "Memory Stream" dobbiamo avere una variabile''
 
' ''di tipo Puntatore, nella quale leggere (o scrivere) appunto con gli "Stream":''</font>
 
 
   Dim p As Pointer   
 
   Dim p As Pointer   
  Dim st As Stream 
 
 
   Dim b1, b2 As Byte   
 
   Dim b1, b2 As Byte   
 
    
 
    
Riga 54: Riga 50:
 
   p = VarPtr(s)   
 
   p = VarPtr(s)   
 
      
 
      
<FONT Color=gray>' ''Generiamo dal Puntatore una variabile di tipo "Stream", con la quale - come già detto - 
 
' ''potremo leggere nell'area di memoria puntata dal Puntatore:''</font>
 
  st = Memory p For Read 
 
 
 
 
  <FONT Color=gray>' ''Leggiamo il 1° byte dell'area di memoria puntata dal Puntatore e la mostriamo in console:''</font>
 
  <FONT Color=gray>' ''Leggiamo il 1° byte dell'area di memoria puntata dal Puntatore e la mostriamo in console:''</font>
   Read #st, b1
+
   b1 = Byte@(p)
   Print Hex(b1),  
+
   Print Hex(b1)   
 
    
 
    
 
  <FONT Color=gray>' ''Leggiamo il 2° byte dell'area di memoria puntata dal Puntatore e la mostriamo in console:''</font>
 
  <FONT Color=gray>' ''Leggiamo il 2° byte dell'area di memoria puntata dal Puntatore e la mostriamo in console:''</font>
   Read #st, b2
+
   b2 = Byte@(p + 1)
   Print Hex(b2)
+
   Print Hex(b2)
 
+
    
<FONT Color=gray>' ''Chiudiamo il flusso di memoria:''</font>
+
  <FONT Color=gray>' ''Vediamo in console il combinato risultato delle due letture:''</font>
   st.Close 
 
 
 
  <FONT Color=gray>' ''Veiamo in console il combinato risultato delle due letture:''</font>
 
 
   Print Chr(b1); Chr(b2)   
 
   Print Chr(b1); Chr(b2)   
 
    
 
    
Riga 82: Riga 71:
 
   '''Public''' Sub Main()
 
   '''Public''' Sub Main()
 
   
 
   
   Dim s As String = "è"
+
   Dim car, s, s1, s2 As String
 +
 
 +
  car = "è"
 
   
 
   
   Print Pointer@(s)
+
   s = Pointer@(car)
 +
 
 +
<FONT Color=gray>' ''Il risultato è costituito dall'indirizzo di memoria della stringa di valori ed alla fine, a destra, dai valori che cerchiamo.''
 +
' ''I  valori costituenti la lettera "è" sono posti in un ordine inverso, ossia così:  A8C3''</font>
 +
  s = Right(s, 4)
 +
 
 +
<FONT Color=gray>' ''Poiché è necessario invertire i due valori esadecimali, si raccoglieranno dapprima le ultime due lettere poi le prime due:''</font>
 +
  s1 = Right(s, 2)
 +
  s2 = Left(s, 2)
 +
 
 +
<FONT Color=gray>' ''Si trasformerà dunque ciascuna coppia di lettere nel corrispondente valore decimale:''</font>
 +
  Print #fl, Chr(Val("&" & s1)) & Chr(Val("&" & s2))
 
   
 
   
 
  '''End'''
 
  '''End'''
 
Il risultato è costituito dall'indirizzo di memoria della stringa di valori ed alla fine, a destra, dai valori che cerchiamo. In questo caso, come si nota, i  valori costituenti la lettera "è" sono posti in un ordine inverso, ossia così:  a8c3
 
 
Sapendo così interpretare quel risultato, siamo in grado comunque di conoscere i due valori che cercavamo.
 

Versione delle 19:07, 16 giu 2016

Come è noto, ogni carattere ASCII che ha un codice da 0 a 127 occupa un byte, invece set di caratteri come UTF-8 con lettere localizzate del tipo è, é, ù e simili richiedono due o più valori del codice ASCII esteso.

E' possibile individuare tali valori costituenti le lettere localizzate mediante almeno quattro modalità.


Uso di un Vettore di tipo Byte[]

Questa modalità è molto semplice. Facciamo un esempio con una lettera costituita da due caratteri:

Public Sub Main()  
     
 Dim s As String = "è"  
 Dim bb As Byte[]  
     
' Carichiamo in un Vettore di tipo "Byte[]" tutti i valori che compongono  
' e rappresentano il carattere contenuto nella variabile di tipo "String":
  bb = Byte[].FromString(s)  
          
' Quindi li vediamo nella console:
  Print Hex(bb[0]), Hex(bb[1])  
     
' Procediamo con la controprova:
  Print Chr(bb[0]); Chr(bb[1])  
     
End


Uso di alcune funzioni sulle Stringhe

Anche quest'altra modalità è abbastanza breve:

Public Sub Main()  
 Dim s As String = "è"  
 
  Print Hex(Asc(Mid("è", 1, 1))), Hex(Asc(Mid("è", 2, 1)))  
 
' Procediamo con la controprova:
  Print Chr(Asc(Mid("è", 1, 1))); Chr(Asc(Mid("è", 2, 1)))  
 
End


Uso dei Puntatori

Questa modalità prevede la lettura dell'area di memoria puntata dalla variabile stringa contenente la lettera localizzata:

Public Sub Main()  
 
' Immagazziniamo i valori che compongono la lettera "è" nella memoria 
' mediante il suo assegnamento in una coerente variabile di tipo Stringa:
 Dim s As String = "è"  
 Dim p As Pointer  
 Dim b1, b2 As Byte  
 
' Generiamo una variabile di tipo Puntatore che punta all'indirizzo di memoria della variabile di tipo Stringa contenente il valore "è":
  p = VarPtr(s)  
    
' Leggiamo il 1° byte dell'area di memoria puntata dal Puntatore e la mostriamo in console:
  b1 = Byte@(p)
  Print Hex(b1)  
 
' Leggiamo il 2° byte dell'area di memoria puntata dal Puntatore e la mostriamo in console:
  b2 = Byte@(p + 1) 
  Print Hex(b2)
  
' Vediamo in console il combinato risultato delle due letture:
  Print Chr(b1); Chr(b2)  
 
End


Usando una funzione di deferenziazione sulla variabile stringa

Mostriamo anche questa quarta modalità, che pur essendo la più breve, restituisce però un risultato da ripulire da alcuni dati che non interessano ai nostri fini, e quindi è da interpretare.

Questa modalità prevede un uso del tutto inusuale della funzione di dereferenziazione Pointer@(), utilizzata solitamente per dereferenziare un Puntatore a Puntatore: nel suo unico argomento verrà posta la variabile Stringa contenente la lettera localizzata.
Ciò nella considerazione che la variabile Stringa punta essa stessa ad un'area di memoria.

 Public Sub Main()

 Dim car, s, s1, s2 As String
 
  car = "è"

  s = Pointer@(car)
  
' Il risultato è costituito dall'indirizzo di memoria della stringa di valori ed alla fine, a destra, dai valori che cerchiamo.
' I  valori costituenti la lettera "è" sono posti in un ordine inverso, ossia così:  A8C3
  s = Right(s, 4)
  
' Poiché è necessario invertire i due valori esadecimali, si raccoglieranno dapprima le ultime due lettere poi le prime due:
  s1 = Right(s, 2)
  s2 = Left(s, 2)
  
' Si trasformerà dunque ciascuna coppia di lettere nel corrispondente valore decimale:
  Print #fl, Chr(Val("&" & s1)) & Chr(Val("&" & s2))

End