Unicode文件可以在文件的开头包含BOM。std.file.readText()将验证此物料清单是否适用于要保存到的编码(字符串、wstring、dstring),但会将物料清单保留为范围的一部分。
解析器通常不希望解析文件,而只是解析一个没有BOM规范的字符串,因为类型是已知的。
如何读取文件并删除BOM表(如果存在)?
发布于 2018-05-09 03:00:49
我所确定的最简单的方法是利用std.encoding来获取物料清单并跳过它。
import std.file;
auto fileContent = readText(file);正如Jonathan提到的,它不适用于非UTF8编码,所以这里有一个测试过的函数,它可以处理string,wstring,dstring和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");
}https://stackoverflow.com/questions/50240622
复制相似问题