I believe that the only real options for file I/O in Phobos at this point (aside from calling C functions) are std.file.readText
and std.stdio.File
. readText
will read in a file as an array of chars, wchars, or dchars (defaulting to immutable(char)[] - i.e. string). I believe that the encoding must be UTF-8, UTF-16, and UTF-32 for chars, wchars, and dchars respectively, though I'd have to go digging in the source code to be sure. Any encodings which are compatible with those encodings (e.g. ASCII is compatible with UTF-8) should work just fine.
If you use File
, then you have several options for functions to read the file with - including readln
and rawRead
. However, you essentially read the file in using a UTF-8, UTF-16, or UTF-32 compatible encoding just like with readText
, or you read it in as binary data and manipulate it yourself.
Since, the character types in D are char, wchar, and dchar, which are UTF-8, UTF-16, and UTF-32 code units respectively, unless you want to read the data in binary format, the file is going to have to be encoded in an encoding compatible with one of those three types of unicode. Given a string in a particular encoding, you can convert it to another encoding using the functions in std.utf
. However, I'm not aware of any way to query a file for its encoding type other than using readText
to try and read the file in a given encoding and see if it succeeds.
So, unless you want to process a file yourself and determine on the fly what encoding it's in, your best bet is probably to just use readText
with each consecutive string type, using the first one which succeeds. However, since text files are normally in UTF-8 or a UTF-8 compatible encoding, I would expect that readText
used with a normal string would almost always work just fine.