NSCharacter Set使用int,但我需要未分配的短片?

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)

}

Die*_*Epp 9

这是一团糟

这是一个完全混乱的原因是因为你遇到了编译器错误 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)

这里的问题是编译器看起来都不够深.

记住,实际上不可能传递shortprintf(),因为它必须得到提升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两者的出现都是巧合.