File.byChunk возвращает диапазон, который возвращает ubyte [] через front.
Быстрый поиск в Google показал, что UTF-8 использует от 1 до 6 байтов для кодирования данных, поэтому просто убедитесь, что у вас всегда есть 6 байтов данных, и вы можете использовать декодирование std.encoding для преобразования его в символ dchar,Затем вы можете использовать toUFT8 из std.utf для преобразования в обычную строку вместо dstring.
Функция преобразования ниже преобразует любой массив без знака в строку.
import std.encoding, std.stdio, std.traits, std.utf;
void main()
{
File input = File("test.txt");
string data = convert(input.byChunk(512));
writeln("Data: ", data);
}
string convert(R)(R chunkRange)
in
{
assert(isArray!(typeof(chunkRange.front)) && isUnsigned!(typeof(chunkRange.front[0])));
}
body
{
ubyte[] inbuffer;
dchar[] outbuffer;
while(inbuffer.length > 0 || !chunkRange.empty)
{
while((inbuffer.length < 6) && !chunkRange.empty)// Max UTF-8 byte length is 6
{
inbuffer ~= chunkRange.front;
chunkRange.popFront();
}
outbuffer ~= decode(inbuffer);
}
return toUTF8(outbuffer); // Convert to string instead of dstring
}