Leggere un file di testo con carattere di fine riga di codifica MAC
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