iPhone代码碎片:处理objective-c里html特殊字符显示问题的一个函数

来源:互联网 发布:淘宝售后客服好做吗 编辑:程序博客网 时间:2024/06/06 03:44
- (NSString *)stringByDecodingXMLEntities {    NSUInteger myLength = [self length];    NSUInteger ampIndex = [self rangeOfString:@"&" options:NSLiteralSearch].location;    // Short-circuit if there are no ampersands.    if (ampIndex == NSNotFound) {        return self;    }    // Make result string with some extra capacity.  NSMutableString *result = [NSMutableString stringWithCapacity:(myLength * 1.25)];   // First iteration doesn't need to scan to & since we did that already, but for code simplicity's sake we'll do it again with the scanner.    NSScanner *scanner = [NSScanner scannerWithString:self];    [scanner setCharactersToBeSkipped:nil];    NSCharacterSet *boundaryCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@" \t\n\r;"];    do {        // Scan up to the next entity or the end of the string.        NSString *nonEntityString;        if ([scanner scanUpToString:@"&" intoString:&nonEntityString]) {            [result appendString:nonEntityString];        }        if ([scanner isAtEnd]) {            goto finish;        }        // Scan either a HTML or numeric character entity reference.        if ([scanner scanString:@"&" intoString:NULL])            [result appendString:@"&"];        else if ([scanner scanString:@"'" intoString:NULL])            [result appendString:@"'"];        else if ([scanner scanString:@""" intoString:NULL])            [result appendString:@"\""];        else if ([scanner scanString:@"<" intoString:NULL])            [result appendString:@"<"];        else if ([scanner scanString:@">" intoString:NULL])            [result appendString:@">"];        else if ([scanner scanString:@"&#" intoString:NULL]) {            BOOL gotNumber;            unsigned charCode;            NSString *xForHex = @"";            // Is it hex or decimal?            if ([scanner scanString:@"x" intoString:&xForHex]) {                gotNumber = [scanner scanHexInt:&charCode];            }            else {                gotNumber = [scanner scanInt:(int*)&charCode];            }            if (gotNumber) {                [result appendFormat:@"%C", charCode];                        [scanner scanString:@";" intoString:NULL];            }            else {                NSString *unknownEntity = @"";                        [scanner scanUpToCharactersFromSet:boundaryCharacterSet intoString:&unknownEntity];                        [result appendFormat:@"&#%@%@", xForHex, unknownEntity];                //[scanner scanUpToString:@";" intoString:&unknownEntity];                //[result appendFormat:@"&#%@%@;", xForHex, unknownEntity];                NSLog(@"Expected numeric character entity but got &#%@%@;", xForHex, unknownEntity);            }        }        else {                NSString *amp;                [scanner scanString:@"&" intoString:&];      //an isolated & symbol                [result appendString:amp];                /*            NSString *unknownEntity = @"";            [scanner scanUpToString:@";" intoString:&unknownEntity];            NSString *semicolon = @"";            [scanner scanString:@";" intoString:&semicolon];            [result appendFormat:@"%@%@", unknownEntity, semicolon];            NSLog(@"Unsupported XML character entity %@%@", unknownEntity, semicolon);                 */        }    }    while (![scanner isAtEnd]);finish:    return result;}

原创粉丝点击