Я работаю с саксофонным парсером libxml2 для чтения больших файлов xml. Большинству обработчиков обратного вызова предоставляется указатель char с нулевым завершением. Используя String.fromCString
, их можно преобразовать в обычную строку в Swift. Однако sax использует буфер для чтения байтов, поэтому один из обратных вызовов (characters
) может вызываться с частью строки, а именно с размером буфера. Эта неполная строка может даже начинаться/заканчиваться на полпути к кодовой точке Unicode. Обратный вызов будет вызываться несколько раз, пока не будет предоставлена полная строка (в кусках).
Я думаю о том, чтобы либо объединить все фрагменты до тех пор, пока не будет собрана полная строка, либо каким-то образом определить границы кодовой точки в частичных строках, обрабатывая только до недопустимой кодовой точки.
Как лучше поступить в таких обстоятельствах? Обработка должна быть максимально быстрой, но при этом корректной. Использование памяти должно быть минимальным, но не за счет производительности.
String.fromCString
, данные кодируются в UTF-8. Вы можете просмотреть последние несколько байтов буфера, чтобы увидеть, где находится граница символа, а затем создать частичную строку, используя NSMutableString(bytes:length:encoding:). Затем сохраните любые дополнительные байты, чтобы добавить их в начало следующего буфера, повторите и добавьте последующие строки в конец оригинала. - person Marc Khadpe   schedule 19.12.2015