D 如何跳过文件';在解析BOM之前,它是什么?

D 如何跳过文件';在解析BOM之前,它是什么?,d,byte-order-mark,D,Byte Order Mark,Unicode文件可以在文件开头包含std.file.readText()将验证此BOM表是否适合其保存到的编码(字符串、wstring、dstring),但保留BOM表作为范围的一部分 解析器通常不希望解析文件,而只是一个没有BOM规范的字符串,因为类型已经已知 如何读取文件并删除BOM表(如果存在)?我确定的最简单的方法是使用std.encoding获取BOM表并跳过它 import std.file; auto fileContent = readText(file); 正如Jonath

Unicode文件可以在文件开头包含
std.file.readText()
将验证此BOM表是否适合其保存到的编码(字符串、wstring、dstring),但保留BOM表作为范围的一部分

解析器通常不希望解析文件,而只是一个没有BOM规范的字符串,因为类型已经已知


如何读取文件并删除BOM表(如果存在)?

我确定的最简单的方法是使用std.encoding获取BOM表并跳过它

import std.file;
auto fileContent = readText(file);
正如Jonathan提到的,它不适用于非UTF8编码,所以这里有一个测试函数,它可以使用string、WSString、DSString和tested

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");
}

只有当它是UTF-8或另一种有时会表现得像UTF-8(例如UTF-7)的编码时,这才有效。如果
readText
没有模板参数,它将验证文本是否为有效的UTF-8<代码>阅读文本!wstring验证它是UTF-16,并且
readText!dstring
验证它是否为UTF-32。UTF-8几乎从来没有BOM表,如果是UTF-7,很有可能会抛出
readText
。因此,虽然代码原样将删除UTF-7或UTF-8 BOM(如果存在),并且文本是有效的UTF-8,但它可能无法工作。使用
readText!wstring
使用该代码应该适用于UTF-16。如果UTF-7是一个问题,可以在UTF-7编码中查找BOM: