c解析html输入密码,目标C/Cocoa触摸中的HTML字符解码

这篇博客主要讨论了在使用NSScanner解析XML实体时遇到的问题,包括删除跳过字符的设置以保留实体间的空格,以及修正独立的'&'符号的处理。作者提供了一个经过修改的代码示例,该代码能够正确处理这些情况,包括HTML和数字字符实体,以及未知实体的错误处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我解决了几个问题:删除NSSCanner的跳过字符(否则两个连续实体之间的空格将被忽略

[扫描器setCharactersToBeSkided:0];

修正了当存在独立的“&”符号时的解析(我不确定这方面的“正确”输出是什么,我只是将其与Firefox进行了比较):

G.ABC DF & B'  & C' Items (288)

以下是修改后的代码:- (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", (unichar)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;}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值