Удаление не-ascii символов из NSData? - PullRequest
0 голосов
/ 03 апреля 2019

Во-первых, я не совсем уверен, что происходит, или если я полностью понимаю это достаточно, чтобы описать проблему, поэтому я постараюсь изо всех сил.

Я кодирую объект NSData, который содержит jsonи один из объектов содержит символ степени.Мы считаем, что это является причиной проблемы, и хотели бы удалить ее перед кодированием, поскольку проблема возникает во время кодирования.

У меня есть множество вариантов удаления определенных символов из строк, но ни один из них не выполняется из NSData.сам объект.Интересно, если это вообще возможно, или если проблема в том, как я его уже кодирую.

Вот как объект NSData кодируется и превращается обратно в объект NSData для сериализации его в json.Сейчас я не пытаюсь удалить символ степени, используя латиницу 1, потому что другой символ, который я хочу использовать, но не нужен, вероятно, это не лучший способ, но он работает для большинства других объектов данных, которые передаютчерез него только не этот, так что это должно измениться.

NSString* stringISOLatin1 = [NSString stringWithCString:data.bytes encoding:NSISOLatin1StringEncoding];
NSData* dataUTF8 = [stringISOLatin1 dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];

Результаты немного странные, в большинстве случаев это работает нормально, даже с учетом символа градуса в тексте при отображении на экране.В других случаях после кодирования строка возвращается в конце в беспорядке, что делает невозможным ее сериализацию.

Любая помощь будет признательна, даже если она просто поможет лучше объяснить, что происходит.Спасибо

1 Ответ

0 голосов
/ 04 апреля 2019

Возможно, проблема в том, что вы используете NSString:stringWithCString:encoding: для преобразования вашего объекта данных.Эта функция требует, чтобы данные заканчивались нулем.Объекты NSData не обязательно должны заканчиваться NULL, потому что они имеют явную длину.Если пропущен символ NULL, он будет продолжать читать все, что будет после строки, что даст вам либо мусор в конце, либо, возможно, сбой из-за нарушения памяти.

Вместо этого попробуйте использовать это:

NSString *stringISOLatin1 = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
...