这个问题是上一个问题的改进版本:
how to decode ubyte[] to a specified encoding?
我正在寻找一种惯用的方式将ubyte[]
属性返回的std.zip.ArchiveMember.expandedData
数组转换为字符串或其他可范围的字符串集合...或者整个内容类似调用File.open("file")
,或以与File.open("file").byLine()
类似的方式迭代的东西。
到目前为止,我从处理字符数组或字符串的标准文档中找到的所有内容都不支持ubyte[]
参数,而且关于D&#zip文件处理的示例非常简陋,仅处理从zip存档及其成员文件中获取原始数据...没有明显的文件/流/ io接口,能够轻松地在原始字节流和面向文本的文件/字符串操作之间进行分层。
我认为我可以在std.utf
或std.uni
中找到解码单个代码点的内容,并且在循环中通过字节流进行/ for循环,但肯定可能有更好的方法吗?
代码示例:
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会是什么?
答案 0 :(得分:1)
也许只是做
auto stuff = cast(char[]) memberFile.expandedData;
使用结果char[] stuff
时,无论如何都将自动解码,例如通过将char[] stuff
作为输入范围传递时调用范围基元的函数。
因为实际上char[]
和string
都没有被解码。只有dchar[]
或dstring
。
答案 1 :(得分:1)
如果您知道字符串是UTF-8编码的,则可以使用std.string.assumeUTF
将其转换为字符串/ char数组。所有这些都是一个演员,如嵌套类型所提到的,但它的模式是自我记录。
如果您需要确保生成的字符串实际上是有效的UTF-8(因为有几个操作在无效字符串上有未定义的行为),那么您可以使用std.utf.validate
。 assumeUTF
也在调试版本下执行此操作。