diff --git a/source/vibe/core/file.d b/source/vibe/core/file.d index 410ddf3..db2a1ea 100644 --- a/source/vibe/core/file.d +++ b/source/vibe/core/file.d @@ -118,7 +118,9 @@ string readFileUTF8(NativePath path) { import vibe.internal.string; - return stripUTF8Bom(sanitizeUTF8(readFile(path))); + auto data = readFile(path); + auto idata = () @trusted { return data.assumeUnique; } (); + return stripUTF8Bom(sanitizeUTF8(idata)); } /// ditto string readFileUTF8(string path) diff --git a/source/vibe/internal/string.d b/source/vibe/internal/string.d index f101364..8c3387b 100644 --- a/source/vibe/internal/string.d +++ b/source/vibe/internal/string.d @@ -25,24 +25,20 @@ import core.exception; Takes a string with possibly invalid UTF8 sequences and outputs a valid UTF8 string as near to the original as possible. */ -string sanitizeUTF8(in ubyte[] str) +string sanitizeUTF8(immutable(ubyte)[] str) @safe pure { - import std.utf; - auto ret = appender!string(); - ret.reserve(str.length); - - size_t i = 0; - while (i < str.length) { - dchar ch = str[i]; - try ch = std.utf.decode(cast(const(char[]))str, i); - catch( UTFException ){ i++; } - //catch( AssertError ){ i++; } - char[4] dst; - auto len = std.utf.encode(dst, ch); - ret.put(dst[0 .. len]); - } - - return ret.data; + import std.encoding : sanitize; + auto ustr = cast(immutable(char)[])str; + return () @trusted { return sanitize(ustr); } (); +} +/// ditto +string sanitizeUTF8(in ubyte[] str) +@trusted pure { + import std.encoding : sanitize; + auto ustr = cast(immutable(char)[])str; + auto ret = sanitize(ustr); + if (ret.ptr is ustr.ptr) return ustr.idup; + else return ret; } /**