Differenze tra le versioni di "Leggere un file di testo con carattere di fine riga di codifica MAC"

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 7: Riga 7:
 
Ciò significa che, andando a leggere con Gambas un file creato con sistema ''Mac'', il valore di ''fine riga/nuova riga a capo'' non verrà interpretato correttamente.
 
Ciò significa che, andando a leggere con Gambas un file creato con sistema ''Mac'', il valore di ''fine riga/nuova riga a capo'' non verrà interpretato correttamente.
  
Per ovviare a questo problema, Gambas fornisce un'apposita proprietà: ''.EndOfLine'' appartenente alla Classe ''File''. In particolare, la proprietà ''.EndOfLine'' va impostata con la costante coerente con il tipo di codifica del ''fine riga/nuova riga a capo'' contenuto dal file di testo da leggere. Dunque, la proprietà ''.EndOfLine'' della variabile di tipo ''File'' non è in grado di dirci a priori quale sia il tipo di carattere di ''fine riga/nuova riga a capo''; ci può dire - invece - il ''tip''o da noi impostato per far troncare ciascuna linea presente nel file di testo in modo coerente con la codifica.
+
Per ovviare a questo problema, Gambas fornisce un'apposita proprietà: ''.EndOfLine'' appartenente alla Classe ''File''. In particolare, la Proprietà ".EndOfLine" va impostata con la costante coerente con il tipo di codifica del ''fine riga/nuova riga a capo'' contenuto dal file di testo da leggere. Dunque, la proprietà ''.EndOfLine'' della variabile di tipo ''File'' non è in grado di dirci a priori quale sia il tipo di carattere di ''fine riga/nuova riga a capo''; ci può dire - invece - il ''tip''o da noi impostato per far troncare ciascuna linea presente nel file di testo in modo coerente con la codifica.
  
Mostriamo di seguito alcuni esempi e modalità di lettura di un file di testo con codifica "''Mac''", ma comunque sempre impostando la proprietà ''.EndOfLine'' della variabile di tipo ''File'' coerentemente con la codifica ''Mac'':
+
Mostriamo di seguito alcuni esempi e modalità di lettura di un file di testo con codifica "''Mac''", ma comunque sempre impostando la Proprietà ".EndOfLine" della variabile di tipo ''File'' coerentemente con la codifica ''Mac'':
  '''Public''' Sub Main()   
+
  Public Sub Main()   
 
        
 
        
  Dim s As String   
+
  Dim s As String   
  Dim fl As File   
+
  Dim fl As File   
 
        
 
        
   fl = Open "''/percorso/del/file/di/testo''" For Input   
+
   fl = Open "<FONT Color=darkgreen>''/percorso/del/file/di/testo/codificato/in/Mac''</font>" For Input   
 
          
 
          
 
  <FONT Color=gray>' ''Sapendo a priori che la codifica del file di testo è quella del Mac, impostiamo la proprietà ".EndOfLine" in modo coerente:''</font>
 
  <FONT Color=gray>' ''Sapendo a priori che la codifica del file di testo è quella del Mac, impostiamo la proprietà ".EndOfLine" in modo coerente:''</font>
Riga 27: Riga 27:
 
   fl.Close   
 
   fl.Close   
 
        
 
        
  '''End'''
+
  End
 
+
oppure con la Proprietà ".Lines":
 
+
  Public Sub Main()   
oppure con la proprietà ''.Lines'':
 
  '''Public''' Sub Main()   
 
 
        
 
        
  Dim s As String   
+
  Dim s As String   
  Dim fl As File   
+
  Dim fl As File   
 
        
 
        
   fl = Open "''/percorso/del/file/di/testo''" For Input   
+
   fl = Open "<FONT Color=darkgreen>''/percorso/del/file/di/testo/codificato/in/Mac''</font>" For Input   
 
          
 
          
 
  <FONT Color=gray>' ''Sapendo a priori che la codifica del file di testo è quella del Mac, impostiamo la proprietà ".EndOfLine" in modo coerente:''</font>
 
  <FONT Color=gray>' ''Sapendo a priori che la codifica del file di testo è quella del Mac, impostiamo la proprietà ".EndOfLine" in modo coerente:''</font>
Riga 47: Riga 45:
 
   fl.Close   
 
   fl.Close   
 
    
 
    
  '''End'''
+
  End
 
+
o anche con il Metodo ".ReadLine()":
 
+
  Public Sub Main()   
o anche con il metodo ''.ReadLine'':
 
  '''Public''' Sub Main()   
 
 
        
 
        
  Dim s As String   
+
  Dim s As String   
  Dim fl As File   
+
  Dim fl As File   
 
        
 
        
   fl = Open "''/percorso/del/file/di/testo''" For Input   
+
   fl = Open "<FONT Color=darkgreen>''/percorso/del/file/di/testo/codificato/in/Mac''</font>" For Input   
 
          
 
          
 
  <FONT Color=gray>' ''Sapendo a priori che la codifica del file di testo è quella del Mac, impostiamo la proprietà "''.EndOfLine''" in modo coerente:''</font>
 
  <FONT Color=gray>' ''Sapendo a priori che la codifica del file di testo è quella del Mac, impostiamo la proprietà "''.EndOfLine''" in modo coerente:''</font>
Riga 68: Riga 64:
 
   fl.Close   
 
   fl.Close   
 
    
 
    
  '''End'''
+
  End
  
  
Qualora non si intenda utilizzare la risorsa ''Open...For Input'', né la proprietà "''.EndOfLine''", ma si preferisca il metodo ''.Load()'' della Classe ''File'', si potrà ovviamente usare la funzione ''Split()'':
+
Qualora non si intenda utilizzare la risorsa ''Open...For Input'', né la Proprietà ".EndOfLine", ma si preferisca il Metodo ".Load()" della Classe ''File'', si potrà ovviamente usare la funzione "Split()":
  '''Public''' Sub Main()   
+
  Public Sub Main()   
 
   
 
   
  Dim s As String   
+
  Dim s As String   
 
        
 
        
   s = File.Load("''/percorso/del/file/di/testo/codificato/in/Mac''")   
+
   s = File.Load("<FONT Color=darkgreen>''/percorso/del/file/di/testo/codificato/in/Mac''</font>")   
 
        
 
        
 
   For Each s In Split(s, "\x0D")   
 
   For Each s In Split(s, "\x0D")   
Riga 82: Riga 78:
 
   Next   
 
   Next   
 
        
 
        
  '''End'''
+
  End
 
+
oppure la funzione "Scan()":
 
+
  Public Sub Main()   
oppure la funzione ''Scan()'':
 
  '''Public''' Sub Main()   
 
 
   
 
   
  Dim s As String   
+
  Dim s As String   
 
        
 
        
   s = File.Load("''/percorso/del/file/di/testo/codificato/in/Mac''")   
+
   s = File.Load("<FONT Color=darkgreen>''/percorso/del/file/di/testo/codificato/in/Mac''</font>")   
 
        
 
        
 
   For Each s In Scan(s, "*\x0D*")   
 
   For Each s In Scan(s, "*\x0D*")   
Riga 96: Riga 90:
 
   Next   
 
   Next   
 
        
 
        
  '''End'''
+
  End

Versione attuale delle 16:07, 24 giu 2024

Il problema che può sorgere leggendo un file di testo con codifica Mac è dato dal carattere di fine riga/nuova riga a capo. Infatti, se per Linux la codifica del carattere di fine riga/nuova riga a capo è data dal valore (in rappresentazione esadecimale) 0x0A (in decimale: 10), carattere escape: " \n ", nella codifica Mac, invece, esso è uguale al valore decimale 13, ossia in esadecimale 0x0D, carattere escape: " \r ".

Poniamo il caso di avere un file di testo, la cui rappresentazione esadecimale è la seguente:

46 6F 72 75 6D 20 64 69 0D 47 61 6D 61 62 73 0D

Da notare i due valori di fine-riga 0x0D, quindi appartenenti alla codifica Mac.

Ciò significa che, andando a leggere con Gambas un file creato con sistema Mac, il valore di fine riga/nuova riga a capo non verrà interpretato correttamente.

Per ovviare a questo problema, Gambas fornisce un'apposita proprietà: .EndOfLine appartenente alla Classe File. In particolare, la Proprietà ".EndOfLine" va impostata con la costante coerente con il tipo di codifica del fine riga/nuova riga a capo contenuto dal file di testo da leggere. Dunque, la proprietà .EndOfLine della variabile di tipo File non è in grado di dirci a priori quale sia il tipo di carattere di fine riga/nuova riga a capo; ci può dire - invece - il tipo da noi impostato per far troncare ciascuna linea presente nel file di testo in modo coerente con la codifica.

Mostriamo di seguito alcuni esempi e modalità di lettura di un file di testo con codifica "Mac", ma comunque sempre impostando la Proprietà ".EndOfLine" della variabile di tipo File coerentemente con la codifica Mac:

Public Sub Main()  
     
  Dim s As String  
  Dim fl As File  
      
  fl = Open "/percorso/del/file/di/testo/codificato/in/Mac" For Input  
        
' Sapendo a priori che la codifica del file di testo è quella del Mac, impostiamo la proprietà ".EndOfLine" in modo coerente:
  fl.EndOfLine = gb.Mac
        
  While Not Eof(fl)  
    Line Input #fl, s  
    Print s  
  Wend  
     
  fl.Close  
     
End

oppure con la Proprietà ".Lines":

Public Sub Main()  
     
  Dim s As String  
  Dim fl As File  
      
  fl = Open "/percorso/del/file/di/testo/codificato/in/Mac" For Input  
        
' Sapendo a priori che la codifica del file di testo è quella del Mac, impostiamo la proprietà ".EndOfLine" in modo coerente:
  fl.EndOfLine = gb.Mac

  For Each s In fl.Lines  
    Print s    
  Next  
 
  fl.Close  
 
End

o anche con il Metodo ".ReadLine()":

Public Sub Main()  
     
  Dim s As String  
  Dim fl As File  
      
  fl = Open "/percorso/del/file/di/testo/codificato/in/Mac" For Input  
        
' Sapendo a priori che la codifica del file di testo è quella del Mac, impostiamo la proprietà ".EndOfLine" in modo coerente:
  fl.EndOfLine = gb.Mac
  
  While Not Eof(fl)    
    s = fl.ReadLine()  
    Print s    
  Wend  
    
  fl.Close  
 
End


Qualora non si intenda utilizzare la risorsa Open...For Input, né la Proprietà ".EndOfLine", ma si preferisca il Metodo ".Load()" della Classe File, si potrà ovviamente usare la funzione "Split()":

Public Sub Main()  

  Dim s As String  
     
  s = File.Load("/percorso/del/file/di/testo/codificato/in/Mac")  
     
  For Each s In Split(s, "\x0D")  
    Print s  
  Next  
     
End

oppure la funzione "Scan()":

Public Sub Main()  

  Dim s As String  
     
  s = File.Load("/percorso/del/file/di/testo/codificato/in/Mac")  
     
  For Each s In Scan(s, "*\x0D*")  
    Print s  
  Next  
     
End