首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在解析文件之前跳过该文件的BOM?

如何在解析文件之前跳过该文件的BOM?
EN

Stack Overflow用户
提问于 2018-05-09 03:00:49
回答 1查看 98关注 0票数 1

Unicode文件可以在文件的开头包含BOMstd.file.readText()将验证此物料清单是否适用于要保存到的编码(字符串、wstring、dstring),但会将物料清单保留为范围的一部分。

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

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-09 03:00:49

我所确定的最简单的方法是利用std.encoding来获取物料清单并跳过它。

代码语言:javascript
运行
复制
import std.file;
auto fileContent = readText(file);

正如Jonathan提到的,它不适用于非UTF8编码,所以这里有一个测试过的函数,它可以处理string,wstring,dstring和tested。

代码语言:javascript
运行
复制
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");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50240622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档