Самый простой способ, который я определил, - это использовать std.encoding для получения спецификации и пропустить ее.
import std.file;
auto fileContent = readText(file);
Как упоминал Джонатан, это не сработает для кодирования не UTF8, поэтому здесь протестированная функция, которая работает со строками, wstring, dstring и test.
import std.traits: isSomeString;
STR skipBom(STR)(STR fileContent) if(isSomeString!STR) {
import std.encoding : getBOM, BOM;
import std.algorithm : skipOver;
import std.traits: CopyTypeQualifiers;
auto byteArray = cast(CopyTypeQualifiers!(STR, ubyte[]))fileContent;
if(getBOM(byteArray).schema != BOM.none)
byteArray.skipOver(getBOM(byteArray).sequence);
return cast(STR)byteArray;
} unittest {
string s = "\xEF\xBB\xBFTesting UTF8";
assert(skipBom(s) == "Testing UTF8");
} unittest {
wstring s = [0xFEFF,'T', 'e', 's', 't', 'i', 'n', 'g', ' ', 'U', 'T', 'F', '1', '6'];
assert(skipBom(s) == "Testing UTF16");
} unittest {
dstring s = [0x0000FEFF,'T', 'e', 's', 't', 'i', 'n', 'g', ' ', 'U', 'T', 'F', '3', '2'];
assert(skipBom(s) == "Testing UTF32");
}