Я считаю, что единственными реальными вариантами ввода / вывода файлов в Фобосе на данный момент (кроме вызова функций C) являются std.file.readText
и std.stdio.File
. readText
будет считываться в файле как массив символов, wchars или dchars (по умолчанию неизменяемый (char) [] - то есть строка). Я считаю, что кодировка должна быть UTF-8, UTF-16 и UTF-32 для chars, wchars и dchars соответственно, хотя я должен был бы покопаться в исходном коде, чтобы быть уверенным. Любые кодировки, которые совместимы с этими кодировками (например, ASCII совместим с UTF-8), должны нормально работать.
Если вы используете File
, у вас есть несколько опций для функций чтения файла, включая readln
и rawRead
. Однако вы, по сути, читаете файл, используя кодировку, совместимую с UTF-8, UTF-16 или UTF-32, точно так же, как с readText
, или считываете его как двоичные данные и управляете им самостоятельно.
Поскольку типами символов в D являются char, wchar и dchar, которые являются кодовыми единицами UTF-8, UTF-16 и UTF-32 соответственно, если вы не хотите читать данные в двоичном формате, файл придется кодировать в кодировке, совместимой с одним из этих трех типов юникода. Задав строку в определенной кодировке, вы можете преобразовать ее в другую кодировку, используя функции из std.utf
. Однако я не знаю ни одного способа запросить у файла тип кодировки, кроме использования readText
, чтобы попытаться прочитать файл в заданной кодировке и посмотреть, удастся ли это.
Итак, если вы не хотите обрабатывать файл самостоятельно и определять на лету, в какой кодировке он находится, лучше всего просто использовать readText
с каждым последовательным типом строки, используя первый, который завершится успешно. Однако, поскольку текстовые файлы обычно имеют кодировку UTF-8 или UTF-8, я ожидаю, что readText
, используемый с нормальной строкой, почти всегда будет работать нормально.