从NSData删除非ASCII字符?

时间:2019-04-03 15:10:20

标签: objective-c nsstringencoding

首先,我不确定发生了什么,或者我是否完全了解它以描述问题,所以我会尽力而为。

我正在编码一个包含json的NSData对象,其中一个对象包含一个度数符号。我们相信这是造成此问题的原因,并且由于在编码过程中会发生问题,因此希望在编码之前将其删除。

我有很多选择可以从字符串中删除某些字符,但是没有从NSData对象本身中删除某些字符的选项。想知道这是否有可能,或者是否与我已经对其进行编码有关。

这是NSData对象被编码并转换回NSData对象以将其序列化为json的方式。现在,我不打算使用拉丁1来删除度数符号,因为我想使用但不需要的另一个字符,这可能不是最好的方法,但它适用于大多数其他传递的数据对象通过它只是没有这个,所以这需要改变。

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

结果有些奇怪,在大多数情况下,即使在屏幕上显示时,即使在文本中包含度数符号,它也能正常工作。编码后的其他时候,字符串又返回到混乱的最后,这使得它无法序列化。

任何帮助将不胜感激,即使它可以更好地解释发生了什么。谢谢

1 个答案:

答案 0 :(得分:0)

问题很可能是您使用NSString:stringWithCString:encoding:来转换数据对象。此功能要求数据以空值终止。 NSData对象不必具有NULL终止,因为它们具有显式的长度。如果缺少NULL字符,它将继续读取字符串后的所有内容,从而使您在结尾处无用或由于内存冲突而崩溃。

相反,请尝试使用此:

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