美文网首页UI进价iOS Developer
解决UIWebView显示HTML字符串特殊符号问题

解决UIWebView显示HTML字符串特殊符号问题

作者: 冷灬叶枫 | 来源:发表于2016-07-19 12:03 被阅读140次

    做项目时后台传入的HTML字符串本来是

    <p><strong>balabalaba</p></strong>
    

    结果被转码成了

    <p><strong>balabalaba</strong></p>
    

    加载到webView显示会有问题,解决办法:

    - (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:&amp];      //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;
    }
    

    相关文章

      网友评论

        本文标题:解决UIWebView显示HTML字符串特殊符号问题

        本文链接:https://www.haomeiwen.com/subject/eipmjttx.html