5

MWFeedParserを使用してアプリにフィードを追加しています。これで、フレームワークは日付を渡しますが、主に古いタイプのコードが原因で、いくつかの警告が表示されます。

現在、4つの警告が残っていますが、これらはすべて同じであり、技術的にはそれらを修正して削除し、警告が消えるようにすることができますが、アプリが正しく機能しないままになります。

に関するコードは次のとおりです。

    // Character sets
NSCharacterSet *stopCharacters = [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@"< \t\n\r%C%C%C%C", 0x0085, 0x000C, 0x2028, 0x2029]];

ここで、警告となるビットは次のとおりです。

\t\n\r%C%C%C%C", 0x0085, 0x000C, 0x2028, 0x2029]];

警告は次のとおりです。

フォーマットはタイプ'unsignedshort'を指定しますが、引数はタイプ'int'です

だから私はに変わりました:

\t\n\r%i%i%i%i", 0x0085, 0x000C, 0x2028, 0x2029]];

これは確かに警告を削除し、私に完璧なコードを与えました:-)(警告やエラーはありません)

その後、アプリを実行すると、日付が解析されず、リンクを開くことができませんでした。これが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];

}

4

3 に答える 3

9
于 2012-11-25T06:47:12.253 に答える
2

問題は0x0085、 などがリテラル int であることです。そのため、これらは、unsigned short である%Cを期待するフォーマット指定子と一致しません。unichar

C でリテラル short を直接指定する方法はなく、Objective-C の拡張機能については知りません。ただし、力ずくのアプローチを使用できます。

NSCharacterSet *stopCharacters =
         [NSCharacterSet characterSetWithCharactersInString:
                  [NSString stringWithFormat:@"< \t\n\r%C%C%C%C", 
                               (unichar)0x0085, (unichar)0x000C,
                               (unichar)0x2028, (unichar)0x2029]];
于 2012-11-25T04:38:51.427 に答える
0

stringWithFormat は必要ありません。\u エスケープを使用して、Unicode 文字を文字列に直接埋め込むことができます。たとえば、\u0085.

于 2012-11-25T04:30:28.377 に答える