Leggere un file di testo con carattere di fine riga di codifica MAC

Da Gambas-it.org - Wikipedia.

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