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.utf
或 std.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.validate
。 assumeUTF
在调试版本下也会这样做。
这个问题是上一个问题的修改版:
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.utf
或 std.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.validate
。 assumeUTF
在调试版本下也会这样做。