Удаление символов, отличных от ascii, из NSData?

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

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

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

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

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

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

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


person Seth Kurkowski    schedule 03.04.2019    source источник
comment
В какой кодировке находится NSData? Символ градуса ничего не значит в данных. Это подразумевает некоторое кодирование. Что за кодировка?   -  person Rob Napier    schedule 03.04.2019


Ответы (1)


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

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

NSString *stringISOLatin1 = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
person LGP    schedule 04.04.2019
comment
Отмечаю вас как правильный ответ, потому что это, вероятно, решает проблему, которую я задал. В ходе дальнейших исследований и разъяснений моих потенциальных клиентов проблема была совершенно другой, поэтому многое из того, что я спрашивал, недействительно, но, вероятно, кому-то это поможет. - person Seth Kurkowski; 05.04.2019