Как пропустить спецификацию файла перед ее анализом? - PullRequest
0 голосов
/ 08 мая 2018

Файл Unicode может содержать BOM в начале файла. std.file.readText() проверит, соответствует ли эта спецификация кодировке, в которую она сохраняет (строка, wstring, dstring), но оставляет спецификацию как часть диапазона.

Синтаксические анализаторы обычно не ожидают синтаксического анализа файла, а вместо этого представляют собой просто строку, которая не имеет спецификации спецификации, поскольку тип уже известен.

Как мне прочитать файл и удалить спецификацию, если она существует?

1 Ответ

0 голосов
/ 08 мая 2018

Самый простой способ, который я определил, - это использовать 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");
}
...