在D中读取文本文件

Meh*_*dad 8 d phobos

是否有任何一种适合所有(或多或少)的方式来读取D中的文本文件?

要求是该函数将自动检测编码并以一致的格式(如a string或a)向我提供文件的整个数据dstring.它应该自动检测BOM并在适当时解释它们.

我试过,std.file.readText()但它不能很好地处理不同的编码.

(当然,这将具有非零故障率,并且这对我的应用程序是可接受的.)

Jon*_*vis 8

我相信此时Phobos文件I/O的唯一真正选项(除了调用C函数)是std.file.readTextstd.stdio.File.readText将读取文件作为字符,wchars或dchars的数组(默认为immutable(char)[] - 即字符串).我相信对于字符,wchars和dchars,编码必须分别是UTF-8,UTF-16和UTF-32,尽管我必须深入挖掘源代码才能确定.任何与这些编码兼容的编码(例如ASCII与UTF-8兼容)应该可以正常工作.

如果你使用File,那么你有几个函数来读取文件 - 包括readlnrawRead.但是,您基本上使用UTF-8,UTF-16或UTF-32兼容编码来readText读取文件,或者您将其作为二进制数据读取并自行操作.

因为,D中的字符类型分别是char,wchar和dchar,它们分别是UTF-8,UTF-16和UTF-32代码单元,除非你想以二进制格式读取数据,否则该文件将具有以与这三种类型的unicode之一兼容的编码进行编码.给定特定编码中的字符串,您可以使用函数将其转换为另一种编码std.utf.但是,除了使用readText尝试以给定编码读取文件并查看是否成功之外,我不知道有任何方法可以查询文件的编码类型.

因此,除非您想自己处理文件并在运行中确定它所使用的编码,否则最好的选择可能是使用readText每个连续的字符串类型,使用第一个成功的字符串.但是,由于文本文件通常是UTF-8或UTF-8兼容编码,我希望readText与普通字符串一起使用几乎总能正常工作.