gpt4 book ai didi

iphone - NSCharacter Set 使用 int,但我需要未分配的短字符?

转载 作者:可可西里 更新时间:2023-11-01 04:21:32 26 4
gpt4 key购买 nike

我正在使用 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]];

警告是:

Format specifies type 'unsigned short' but the argument has type '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];

最佳答案

一团糟

之所以一团糟,是因为您遇到了编译器错误 C 规范中的任意限制。

滚动到底部进行修复。

编译警告

Format specifies type 'unsigned short' but the argument has type 'int'

我的结论是,这是 Clang 中的编译器错误。忽略此警告绝对是安全的,因为 (unsigned short) 参数在传递给可变参数函数之前总是被提升为 (int)反正。这是 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.

这里的问题是两个编译器看起来都不够深入。

请记住,实际上不可能将 short 传递给 printf(),因为它必须 提升为 int。 GCC 从不对常量发出警告,Clang 会忽略您传递常量的事实并始终发出警告,因为类型错误。这两个选项都是错误的。

我怀疑没有人注意到,因为——你为什么要将常量表达式传递给 printf()

短期内,您可以使用以下 hack:

#pragma GCC diagnostic ignored "-Wformat"

通用字符名称

您可以使用\uXXXX 表示法。除非你不能,因为编译器不会让你以这种方式使用 U+0085。为什么?参见 C99 的第 6.4.3 节:

A universal character name shall not specify a character whose short identifier is less than 00A0 other than 0024 ($), 0040 (@), or 0060 (), nor one in the range D800 through DFFF inclusive.

这排除了 \u0085

There is a proposal to fix this part of the spec.

修复

你真的想要一个常量字符串,不是吗?使用这个:

[NSCharacterSet characterSetWithCharactersInString:
@"\t\n\r\xc2\x85\x0c\u2028\u2029"]

这依赖于源编码为 UTF-8 的事实。别担心,这不会很快改变。

字符串中的\xc2\x85U+0085的UTF-8编码。 85 在两者中的出现纯属巧合。

关于iphone - NSCharacter Set 使用 int,但我需要未分配的短字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com