jwk*_*knz 5 c iphone objective-c nscharacterset ios
我正在使用MWFeedParser将Feed添加到我的应用中.现在框架传递了日期,我有一些警告主要是由于旧的代码类型.
现在剩下4个警告都是相同的,从技术上讲我可以修复它们并删除它们以便警告消失,但随后我得知应用程序无法正常工作.
有关的代码是:
// Character sets
NSCharacterSet *stopCharacters = [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@"< \t\n\r%C%C%C%C", 0x0085, 0x000C, 0x2028, 0x2029]];
Run Code Online (Sandbox Code Playgroud)
现在警告的一点是:
\t\n\r%C%C%C%C", 0x0085, 0x000C, 0x2028, 0x2029]];
Run Code Online (Sandbox Code Playgroud)
警告是:
Format指定类型'unsigned short'但参数的类型为'int'
所以我换成了:
\t\n\r%i%i%i%i", 0x0085, 0x000C, 0x2028, 0x2029]];
Run Code Online (Sandbox Code Playgroud)
确实删除了警告并给了我完美的代码:-)(没有警告或错误)
当我运行应用程序时,它没有解析日期,也无法打开链接.我不确定这是否是C的东西,但现在它绝对不属于我的知识领域.是否有人可以帮助我,可以解决这个问题,仍然有它在应用程序中工作?
先感谢您:-)
- (NSString *)stringByConvertingHTMLToPlainText {
// Pool
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Character sets
NSCharacterSet *stopCharacters = [NSCharacterSet characterSetWithCharactersInString:@"< \t\n\r\x0085\x000C\u2028\u2029"];
NSCharacterSet *newLineAndWhitespaceCharacters = [NSCharacterSet characterSetWithCharactersInString:@"< \t\n\r\205\014\u2028\u2029"];
NSCharacterSet *tagNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"];
// Scan and find all tags
NSMutableString *result = [[NSMutableString alloc] initWithCapacity:self.length];
NSScanner *scanner = [[NSScanner alloc] initWithString:self];
[scanner setCharactersToBeSkipped:nil];
[scanner setCaseSensitive:YES];
NSString *str = nil, *tagName = nil;
BOOL dontReplaceTagWithSpace = NO;
do {
// Scan up to the start of a tag or whitespace
if ([scanner scanUpToCharactersFromSet:stopCharacters intoString:&str]) {
[result appendString:str];
str = nil; // reset
}
// Check if we've stopped at a tag/comment or whitespace
if ([scanner scanString:@"<" intoString:NULL]) {
// Stopped at a comment or tag
if ([scanner scanString:@"!--" intoString:NULL]) {
// Comment
[scanner scanUpToString:@"-->" intoString:NULL];
[scanner scanString:@"-->" intoString:NULL];
} else {
// Tag - remove and replace with space unless it's
// a closing inline tag then dont replace with a space
if ([scanner scanString:@"/" intoString:NULL]) {
// Closing tag - replace with space unless it's inline
tagName = nil; dontReplaceTagWithSpace = NO;
if ([scanner scanCharactersFromSet:tagNameCharacters intoString:&tagName]) {
tagName = [tagName lowercaseString];
dontReplaceTagWithSpace = ([tagName isEqualToString:@"a"] ||
[tagName isEqualToString:@"b"] ||
[tagName isEqualToString:@"i"] ||
[tagName isEqualToString:@"q"] ||
[tagName isEqualToString:@"span"] ||
[tagName isEqualToString:@"em"] ||
[tagName isEqualToString:@"strong"] ||
[tagName isEqualToString:@"cite"] ||
[tagName isEqualToString:@"abbr"] ||
[tagName isEqualToString:@"acronym"] ||
[tagName isEqualToString:@"label"]);
}
// Replace tag with string unless it was an inline
if (!dontReplaceTagWithSpace && result.length > 0 && ![scanner isAtEnd]) [result appendString:@" "];
}
// Scan past tag
[scanner scanUpToString:@">" intoString:NULL];
[scanner scanString:@">" intoString:NULL];
}
} else {
// Stopped at whitespace - replace all whitespace and newlines with a space
if ([scanner scanCharactersFromSet:newLineAndWhitespaceCharacters intoString:NULL]) {
if (result.length > 0 && ![scanner isAtEnd]) [result appendString:@" "]; // Dont append space to beginning or end of result
}
}
} while (![scanner isAtEnd]);
// Cleanup
[scanner release];
// Decode HTML entities and return
NSString *retString = [[result stringByDecodingHTMLEntities] retain];
[result release];
// Drain
[pool drain];
// Return
return [retString autorelease];
Run Code Online (Sandbox Code Playgroud)
}
这是一个完全混乱的原因是因为你遇到了编译器错误和 C规范中的任意限制.
滚动到底部进行修复.
Format指定类型'unsigned short'但参数的类型为'int'
我的结论是这是Clang中的编译器错误.忽略此警告肯定是安全的,因为无论如何(unsigned short),(int)在将参数传递给vararg函数之前,参数始终会被提升.这是C标准中的所有内容(它也适用于Objective C).
printf("%hd", 1); // Clang generates warning. GCC does not.
// Clang is wrong, GCC is right.
printf("%hd", 1 << 16); // Clang generates warning. GCC does not.
// Clang is right, GCC is wrong.
Run Code Online (Sandbox Code Playgroud)
这里的问题是编译器看起来都不够深.
记住,实际上不可能传递short给printf(),因为它必须得到提升int.GCC从不对常量发出警告,Clang忽略了这样一个事实,即你传递一个常量并总是发出警告,因为类型错误.两种选择都是错误的.
我怀疑没有人注意到因为 - 为什么你会传递一个恒定的表达式printf()呢?
在短期内,您可以使用以下hack:
#pragma GCC diagnostic ignored "-Wformat"
Run Code Online (Sandbox Code Playgroud)
您可以使用\uXXXX符号.除了你不能,因为编译器不会让你使用U+0085这种方式.为什么?见C99第6.4.3节:
一种通用字符名称不应指定字符,其短标识符为小于
00A0比其它0024($), (0040),@或0060(‘),也不在一个范围内D800,通过DFFF以下.
这排除了\u0085.
你真的想要一个恒定的字符串,不是吗?用这个:
[NSCharacterSet characterSetWithCharactersInString:
@"\t\n\r\xc2\x85\x0c\u2028\u2029"]
Run Code Online (Sandbox Code Playgroud)
这取决于源编码是UTF-8的事实.别担心,这不会很快改变.
的\xc2\x85字符串中是的UTF-8编码U+0085.85两者的出现都是巧合.
| 归档时间: |
|
| 查看次数: |
1234 次 |
| 最近记录: |