Objective C 中的 NSString 损坏或编码问题
Posted
技术标签:
【中文标题】Objective C 中的 NSString 损坏或编码问题【英文标题】:Corruption of NSString or encoding issue in Objective C 【发布时间】:2017-01-11 05:00:40 【问题描述】:请看下面的代码:
+ (void)splashDataFromJSON:(NSData *)objectNotation error:(NSError **)error
NSError *localError = nil;
NSDictionary *parsedObject = [NSJSONSerialization JSONObjectWithData:objectNotation options:0 error:&localError];
if (localError != nil)
*error = localError;
NSMutableArray* btms = [[NSMutableArray alloc] init];
NSMutableDictionary* btmManufacturerResolutionDictionary = [[BTMCache sharedManager] btmManufacturerResolutionDictionary];
NSArray *results = [parsedObject valueForKey:@"results"];
NSLog(@"Count %d", parsedObject.count);
NSString* imageBaseUrl = [[parsedObject valueForKey:@"general"] valueForKey:@"image_base_url"];
imageBaseUrl = [imageBaseUrl stringByAppendingString:@"hdpi/"];
NSString* splashImageName = [[[parsedObject valueForKey:@"general"] valueForKey:@"splash"] valueForKey:@"img"];
NSString* splashAdvertiserURL = [[[[parsedObject valueForKey:@"general"] valueForKey:@"splash"] valueForKey:@"url"] copy];
NSMutableString* appendedString = [[NSMutableString alloc] init];
for(int i =0 ;i<[splashAdvertiserURL length]; i++)
char character = [splashAdvertiserURL characterAtIndex:i];
printf(&character);
sleep(0.1);
if (character != "!")
[appendedString appendFormat:@"%c", character];
[[SplashData sharedManager] setSplashAdvertiserURL:appendedString];
[[SplashData sharedManager] setSplashImageName:splashImageName];
splashAdvertiserURL = [[SplashData sharedManager] splashAdvertiserURL];
兴趣点在 splashAdvertiserURL。当我收到这些数据并使用 po 打印出来时,它会显示为“https://radar.com/ref/go/84/”。这很好,符合预期。当我查看 JSONLint 中的传入数据时,它看起来像这样:
"general":
"image_base_url": "https:\/\/radar.com\/img\/manufacturers\/",
"splash":
"img": "image1.png",
"url": "https:\/\/radar.com\/ref\/go\/84\/"
,
如您所见,我进一步将 NSString 放入具有 NSString 属性的单例中。这里没有异常。然后我继续检索它以查看一切正常。此外,该计划继续进行。在另一个类中,我希望检索此信息,当我尝试这样做时,它会抛出 EXC_BAD_ACCESS。里面好像有垃圾。
然后我在代码中放入一个循环,如您所见,一次打印出一个字符。非常奇怪的是,当我使用 po 打印出来时,我得到:
https:// r 一种 d ar.com/ref/go/8 4!/"
正是这种格式。如果我然后继续硬编码字符串 https://radar.com/ref/go/84/ - 包括转义字符和所有内容,那么一切正常。没有问题。如果我处理没有转义字符的普通字符串,它也可以很好地存储在单例中,没问题。在此输入代码
对于发生的事情,我很困惑。有人可以帮忙吗?
谢谢
【问题讨论】:
不应该是character != '!'
吗? (单引号比较char
)?如果将objectNotation
转换为NSString
(alloc
/initWithData:encoding:
使用UTF8),它是否有`\`?
抱歉,该代码已被删除 - 几乎无关紧要。我正忙着玩它。
【参考方案1】:
对于您收到的作为字符串的 URL,您需要在将其用于您的应用程序之前对其进行编码。看看下面的代码:
NSString *sampleUrl = @"https:\/\/radar.com\/ref\/go\/84\/";
NSString *encodedUrl = [sampleUrl stringByAddingPercentEscapesUsingEncoding:
NSUTF8StringEncoding];
【讨论】:
感谢您的评论。我以前试过这个,现在再次检查。同样的问题。我可能需要使用另一种编码吗? 请尝试人类可读的 URL 字符串,例如NSString *sampleUrl = @"https://radar.com/ref/go/84/";
以上是关于Objective C 中的 NSString 损坏或编码问题的主要内容,如果未能解决你的问题,请参考以下文章
如何解析数据,如果它是Objective c中的`isKindOfClass([NSString] class)`
将 NSArray 中的每个 NSString 元素显示为 UIButton Objective C