Я работаю с sax-парсером libxml2, чтобы читать большие XML-файлы. Большинство обработчиков обратного вызова снабжены указателем на символ с символом NULL. Используя String.fromCString
, они могут быть преобразованы в обычную строку в Swift. Однако sax использует буфер для чтения байтов, поэтому один из обратных вызовов (characters
) может быть вызван с частью строки, а именно с размером буфера. Эта частичная строка может даже начинаться/заканчиваться наполовину кодовой точкой Юникода. Обратный вызов будет вызываться несколько раз, пока не будет предоставлена полная строка (в кусках).Как справиться с буферизованными строками из C в Swift?
Я собираюсь либо конкатенировать все куски до тех пор, пока не будет собрана полная строка, или каким-либо образом обнаружит границы кодовых границ в частичных строках, только обработка завершится до недопустимого кодового слова.
Что было бы лучшим способом справиться с такими обстоятельствами? Обработка должна быть как можно быстрее, хотя и правильной. Использование памяти должно быть минимальным, но не ценой производительности.
Я не испытывал с саксофоном анализатором Libxml2, но [здесь] (http://www.jamesh.id.au/ articles/libxml-sax/libxml-sax.html # символов) говорится, что: «В вашем обратном вызове вы, вероятно, захотите скопировать символы в другой буфер ...» *. Это можно сделать, например, с помощью NSMutableData. –
Если вы используете 'String.fromCString', тогда данные кодируются в UTF-8.Вы можете посмотреть последние несколько байтов буфера, чтобы увидеть, где находится граница символа, а затем создать частичную строку, используя NSMutableString (bytes: length: encoding :). Затем сохраните любые дополнительные байты для добавления к следующему буферу, повторите и добавьте последующие строки в конец оригинала. –