Credo che le uniche opzioni reali per file di I/O in Phobos a questo punto (a parte chiamando le funzioni C) sono std.file.readText
e std.stdio.File
. readText
leggerà in un file come una matrice di caratteri, wchars o dchars (per impostazione predefinita a immutable (char) [] - i.e. stringa). Credo che la codifica deve essere UTF-8, UTF-16 e UTF-32 rispettivamente per char, wchars e dchar, anche se dovrei andare a scavare nel codice sorgente per essere sicuro. Qualsiasi codifica compatibile con tali codifiche (ad esempio ASCII è compatibile con UTF-8) dovrebbe funzionare correttamente.
Se si utilizza File
, allora si hanno diverse opzioni per le funzioni di leggere il file con - tra cui readln
e rawRead
. Tuttavia, in pratica si legge il file utilizzando una codifica UTF-8, UTF-16 o UTF-32 compatibile come con lo readText
, oppure lo si legge come dati binari e lo si manipola da soli.
Poiché, i tipi di carattere in D sono char, wchar e dchar, che sono rispettivamente unità di codice UTF-8, UTF-16 e UTF-32, a meno che non si desideri leggere i dati in formato binario, il file sta per essere codificato in una codifica compatibile con uno di questi tre tipi di Unicode. Data una stringa in una particolare codifica, è possibile convertirla in un'altra codifica utilizzando le funzioni in std.utf
. Tuttavia, non sono a conoscenza di alcun modo per interrogare un file per il suo tipo di codifica diverso dall'uso di readText
per provare a leggere il file in una determinata codifica e vedere se ha esito positivo.
Quindi, a meno che tu non voglia elaborare un file tu stesso e determinare al volo quale codifica sia, la soluzione migliore è probabilmente usare semplicemente readText
con ogni tipo di stringa consecutivo, utilizzando il primo che riesce. Tuttavia, poiché i file di testo sono normalmente in codifica UTF-8 o UTF-8, mi aspetto che lo readText
utilizzato con una stringa normale funzioni quasi sempre alla perfezione.
fonte
2011-01-18 00:04:05
Hm ... qualche idea su cosa fare con le BOM? – Mehrdad
@Lambert, suggerisco caldamente di usare read() in quanto non esegue alcuna convalida, ma puoi farlo tu stesso e non stai leggendo il file più volte. Per la distinta base è possibile eseguire il cast per ubyte e confrontare i primi byte, quindi eseguire un cast per il resto della sezione ... –
Hm ... non la soluzione che speravo (non volevo controllare manualmente la distinta base) ma non è troppo male, credo; Grazie. – Mehrdad