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 转换为NSStringalloc/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)`

在Objective C中比较NSString

将 NSArray 中的每个 NSString 元素显示为 UIButton Objective C

从 Objective C 调用 Swift 中定义的 NSString 扩展

Objective C 如何解析这个 NSString

Objective C 将 NSString 放在 NSLog 中