Text 将文本文件转换为D中的UTF8

Text 将文本文件转换为D中的UTF8,text,utf-8,character-encoding,d,Text,Utf 8,Character Encoding,D,我正在尝试使用Phobos标准库函数读入任何有效的UTF文件(UTF-8、UTF-16或UTF-32),并将其作为UTF-8字符串(也称为D的字符串)取回。看完这些文档后,我能想到的最简洁的功能就是 using std.file, std.utf; string readToUTF8(in string filename) { try { return readText(filename); } catch (UTFException e) {

我正在尝试使用Phobos标准库函数读入任何有效的UTF文件(UTF-8、UTF-16或UTF-32),并将其作为UTF-8字符串(也称为D的
字符串
)取回。看完这些文档后,我能想到的最简洁的功能就是

using std.file, std.utf;

string readToUTF8(in string filename)
{
    try {
        return readText(filename);
    }
    catch (UTFException e) {
        try {
            return toUTF8(readText!wstring(filename));
        }
        catch (UTFException e) {
            return toUTF8(readText!dstring(filename));
        }
    }
}
然而,捕捉一系列层叠的异常似乎极为不切实际。有没有一种“更干净”的方法可以在不依赖于捕获一系列异常的情况下进行呢


此外,如果源文件是UTF-16或UTF-32,则上面的函数似乎会在结果字符串中返回一个单字节BOM,鉴于它是UTF-8,我想省略它。除了显式剥离它之外,还有什么方法可以省略它吗?

您的问题之一回答了另一个问题:BOM允许您识别文件中使用的确切UTF编码

理想情况下,
readText
可以为您实现这一点。目前,它没有,所以您必须自己实现它


我建议使用
std.file.read
,将返回的
void[]
强制转换为
ubyte[]
,然后查看前几个字节是否以BOM开头,然后将结果强制转换为适当的字符串类型,并将其转换为
字符串(使用
toUTF8
to!string
).

对于缺少BOM的UTF-16或UTF-32字符串,您有何建议?如果没有BOM,您将如何识别编码?UTF-8很好,因为随机字节字符串不太可能验证,但UTF-16和UTF-32需要。。。我认为猜测是基于你在没有BOM或类似文件扩展名的情况下遇到的零的数量来让你知道的。这很公平。如果这些是愚蠢的问题,我很抱歉;最近,我从“所有文本都是ASCII”的梦想中醒来,并尝试尽我所能处理Unicode。下面是一个编码检测出错的示例: