D: 将 ubyte[] 解码为字符串,redux

D: decoding ubyte[] to string, redux

这个问题是上一个问题的修改版:

how to decode ubyte[] to a specified encoding?

我正在寻找一种惯用的方法来将从 std.zip.ArchiveMember.expandedData 属性返回的 ubyte[] 数组转换为字符串或其他可调整范围的字符串集合...调用 File.open("file"),或以与 File.open("file").byLine().

类似的方式进行迭代

到目前为止,我从处理字符数组或字符串的标准文档中找到的所有内容都不支持 ubyte[] 参数,并且围绕 D 的 zip 文件处理的示例非常基本,只处理获取来自 zip 存档及其成员文件的原始数据...没有明显的 file/stream/io 接口,能够轻松地在原始字节流和面向文本的 file/string 操作之间分层。

我想我可以在 std.utfstd.uni 中找到一些东西来解码单个代码点,并且 while/for-loop 我通过字节流的方式,但是肯定有更好的方法吗?

代码示例:

std.zip.ZipArchive zipFile;
// just humor me, this is what I've been given.
zipFile = new std.zip.ZipArchive("dataSet.csv.zip");
foreach(memberFile; zipFile.directory)
{
    zipFile.expand(memberFile);
    ubyte[] uByteArray = memberFile.expandedData;

    // ok, now what?
    // is there a relatively simplistic way to get this
    // decoded/translated byteStream into a string
    // or collection of strings(for example, one string per line
    // of the compressed file) ?

    string completeCsvContents = uByteArray.PQR();
    string[] csvRows = uByteArray.XYZ();
}

对于 PQR 或 XYZ,我可以轻松填写​​什么吗?

或者,如果需要以

的风格进行 API 调用
string csvData = std.ABC.PQR(uByteArray)

ABC/PQR 会是什么?

也许只是

auto stuff = cast(char[]) memberFile.expandedData; 

当使用结果 char[] stuff 时,它无论如何都会被自动解码,例如在将此 char[] stuff 作为输入范围传递时调用范围基元的函数。

因为实际上 char[]string 都没有被解码。只有 dchar[]dstring 是。

如果您知道该字符串是 UTF-8 编码的,则可以使用 std.string.assumeUTF 将其转换为 string/char 数组。正如 Nested type 所提到的,所有这一切都是强制转换,但它是自记录模式。

如果您需要确保生成的字符串实际上是有效的 UTF-8(因为有几个操作对无效字符串具有未定义的行为),那么您可以使用 std.utf.validateassumeUTF 在调试版本下也会这样做。