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

String D:将ubyte[]解码为字符串,redux,string,zip,d,decode,bytestream,String,Zip,D,Decode,Bytestream,此问题是对上一个问题的修改: 我正在寻找一种惯用方法,将std.zip.ArchiveMember.expandedData属性返回的ubyte[]数组转换为字符串或其他可范围的字符串集合。。。整个内容要么类似于调用File.open(“File”),要么类似于File.open(“File”).byLine() 到目前为止,我从处理字符数组或字符串的标准文档中发现的所有内容都不支持ubyte[]参数,关于D的zip文件处理的示例非常简单,只涉及从zip存档及其成员文件中获取原始数据。。。没有

此问题是对上一个问题的修改:

我正在寻找一种惯用方法,将
std.zip.ArchiveMember.expandedData
属性返回的
ubyte[]
数组转换为字符串或其他可范围的字符串集合。。。整个内容要么类似于调用
File.open(“File”)
,要么类似于
File.open(“File”).byLine()

到目前为止,我从处理字符数组或字符串的标准文档中发现的所有内容都不支持
ubyte[]
参数,关于D的zip文件处理的示例非常简单,只涉及从zip存档及其成员文件中获取原始数据。。。没有明显的文件/流/io接口,能够轻松地在原始ByTestStream和面向文本的文件/字符串操作之间分层

我想我可以在
std.utf
std.uni
中找到一些东西来解码各个代码点,并通过ByTestStream进行while/for循环,但肯定有更好的方法吗

代码示例:

std.zip.ZipArchive-zipFile;
//别逗我,这就是我得到的。
zipFile=new std.zip.ZipArchive(“dataSet.csv.zip”);
foreach(memberFile;zipFile.directory)
{
展开(成员文件);
ubyte[]uByteArray=memberFile.expandedData;
//好吧,现在怎么办?
//有没有一种相对简单的方法来实现这一点
//由TestStream解码/转换为字符串
//或字符串的集合(例如,每行一个字符串)
//(压缩文件的名称)?
字符串completeCsvContents=uByteArray.PQR();
字符串[]csvRows=uByteArray.XYZ();
}
有什么我可以轻松填写的PQR或XYZ吗

或者,如果是以

string csvData=std.ABC.PQR(uByteArray)
ABC/PQR会是什么?

也许就这么做吧

auto stuff = cast(char[]) memberFile.expandedData; 
当使用生成的
char[]stuff
时,它将自动解码,例如,通过将此
char[]stuff
作为输入范围传递时调用范围原语的函数


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

如果您知道字符串是UTF-8编码的,可以使用将其转换为字符串/字符数组。正如嵌套类型所提到的,这只是一个强制转换,但它是一个自文档化的模式


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

好吧,也许需要在不同的方向进行更多的搜索。似乎Adam Ruppe有一个模块可以完成这项工作:我将试用它,如果它工作正常,就像它看起来应该的那样,那么我将回答我自己的问题。这取决于文件的编码方式。如果它已经是ascii或utf-8,只需将其强制转换为
char[]
。如果是像Windows-1252这样的东西,Excel通常以英语保存,那么像我的characterencodings.d模块这样的东西将帮助您转换。我在浏览了您的源代码后意识到了这一点,我以前从未详细使用过utf-8,所以我不确定哪种类型的转换假设是安全的。非常感谢您的回复,谢谢。是的,如果它已经有效(我的函数tryToDetermineEncoding执行此检查),则可以安全地进行强制转换。UTF-8有效性在随机字节流中很少见,但其他编码很难理解这就是它返回的全部内容的原因),或者只有所有值
<128
。这仍然不一定是正确的,但几乎可以肯定是正确的。但是,不应强制转换任何尚未进行utf8编码的>=128的值-如果您尝试将其用作字符串,则会抛出该值。我在这台计算机上没有任何文件,因此无法查看格式,但这将是一个很好的安全检查。非常感谢。(和嵌套类型)