我正在使用libxml2的sax解析器来读取大型xml文件。大多数回调处理程序都提供了一个NULL终止的字符指针。使用String.fromCString
这些可以转换为Swift中的常规字符串。但是,sax使用缓冲区来读取字节,因此可以使用字符串的一部分(即缓冲区的大小)调用其中一个回调函数(characters
)。这部分字符串甚至可能在Unicode代码点的中途开始/结束。回调将被多次调用,直到提供完整的字符串(以块为单位)。如何在Swift中处理来自C的缓冲字符串?
我想连接所有的块,直到完整的字符串可以组装,或者以某种方式检测部分字符串中的代码点边界,只处理完成直到无效的代码点。
处理这种情况的最佳方法是什么?处理过程应尽可能快,但仍然正确。内存使用应尽可能少,但不要牺牲性能。
我不跟的libxml2的SAX解析器经验丰富,但是这里(http://www.jamesh.id.au/ articles/libxml-sax/libxml-sax.html#characters)据说*“在你的回调中,你可能想要将字符复制到其他缓冲区......”*。这可以例如用NSMutableData完成。 –
如果您使用'String.fromCString',那么数据以UTF-8编码。您可以查看缓冲区的最后几个字节以查看字符边界的位置,然后使用NSMutableString(bytes:length:encoding :)创建部分字符串。然后保存任何额外的字节以预先添加到下一个缓冲区,重复并将后续字符串附加到原始结尾。 –