NSXMLParser由Windows-1252编码

时间:2009-08-07 12:40:29

标签: iphone cocoa-touch nsxmlparser

因此,NSXMLParser在使用Windows-1252编码器解析字符串时遇到问题。现在我确实在这个页面上找到了一个解决方案,将其转换为NSUTF8StringEncoding。但是现在它碰到了无法解析的角色。

所以我发现,如果我要转义特殊字符然后在解析之后将其传回来,它将会起作用。例如:

string = [string stringByReplacingOccurrencesOfString:@":" withString:@"__58__"];

由于允许使用_字符而不会出现解析器错误,因此在NSXMLParser中我可以将值传回给它正确的字符。

那么有没有办法可以循环遍历所有ASCII字符,这样我就可以替换所有特殊字符(当然除了<,>和_)?

3 个答案:

答案 0 :(得分:0)

完全未经测试。我甚至不知道它是否编译,但它可能会让你走上正轨。 string必须是NSMutableString

NSRange r = NSMakeRange(0, [string length]);
while (r.location < [string length])
{
  r = [string rangeOfCharactersFromSet:[NSCharacterSet symbolCharacterSet] options:0 range:r];
  if (r.location != NSNotFound)
  {
    NSMutableString *replacement = [[NSMutableString alloc] initWithCapacity:6];
    for (NSUInteger i = r.location; i <= NSMaxRange(r); i++)
    {
      unichar c = [string characterAtIndex:i];
      if (c != "_")
      {
        [replacement appendFormat:@"__%d__", (unsigned)c];
      }
    }
    [string replaceCharactersInRange:r withString:replacement];
    [replacement release]; replacement = nil;
    r.location = r.location + [string length] + 1;
    r.length = [string length] - r.location;
  }
}

答案 1 :(得分:0)

假设您有一个NSMutableString str,您可以执行以下操作:

NSMutableString *str = ...;
[str replaceOccurrencesOfString:":" withString:@"__58__"
                        options:NSLiteralSearch
                          range:NSMakeRange(0, [str length])];
[str replaceOccurrencesOfString:"&" withString:@"__38__"
                        options:NSLiteralSearch
                          range:NSMakeRange(0, [str length])];

你看到了模式!

您也可以使用XML个实体来获取这些值,例如将&替换为&amp;

答案 2 :(得分:0)

感谢大家的帮助,这段代码实际上解决了我的问题:

for (unichar asciiChar = 1; asciiChar <= 255; asciiChar++) {
    NSString *stringWithAsciiChar = [NSString stringWithCharacters:&asciiChar length:1];
    if (stringWithAsciiChar == nil) continue;
    string = [string stringByReplacingOccurrencesOfString:stringWithAsciiChar withString:[NSString stringWithFormat:@"__%d__", asciiChar]];
}