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

Da Gambas-it.org - Wikipedia.
(Creata pagina con '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...')
 
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 15: Riga 15:
 
   Dim fl As File   
 
   Dim fl As File   
 
        
 
        
   fl = Open "''/percorso/del/file/di/testo''" For Input   
+
   fl = Open "''/percorso/del/file/di/testo/codificato/in/Mac''" 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 36: Riga 36:
 
   Dim fl As File   
 
   Dim fl As File   
 
        
 
        
   fl = Open "''/percorso/del/file/di/testo''" For Input   
+
   fl = Open "''/percorso/del/file/di/testo/codificato/in/Mac''" 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 56: Riga 56:
 
   Dim fl As File   
 
   Dim fl As File   
 
        
 
        
   fl = Open "''/percorso/del/file/di/testo''" For Input   
+
   fl = Open "''/percorso/del/file/di/testo/codificato/in/Mac''" 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>
 
   fl.EndOfLine = gb.Mac
 
   fl.EndOfLine = gb.Mac
 
    
 
    
Riga 71: Riga 71:
  
  
Qualora non si intenda utilizzare la risorsa ''Open...For Input'', ma si preferisca la 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()   
 
   
 
   

Versione attuale delle 08:48, 28 lug 2015

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