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

Da Gambas-it.org - Wikipedia.
Versione del 28 lug 2015 alle 08:45 di Vuott (Discussione | contributi) (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...')

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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" 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" 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" 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, ma si preferisca la 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