NSXMLParser, закодированный Windows-1252 - PullRequest
0 голосов
/ 07 августа 2009

Таким образом, NSXMLParser имеет проблемы с синтаксическим анализом строк с помощью кодировщика Windows-1252. Теперь я нашел решение на этой странице, чтобы преобразовать его в NSUTF8StringEncoding. Но теперь он сталкивается с символами, которые не может разобрать.

Итак, я понял, что это сработает, если я буду экранировать специальные символы, а затем перенесу их обратно после анализа. Например:

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

Поскольку разрешено использовать символ _ без получения ошибки синтаксического анализатора, а в NSXMLParser я могу передать значение обратно в его правильный символ.

Так есть ли способ, которым я могу перебрать все символы ASCII, чтобы я мог заменить все специальные символы (кроме, конечно, <,> и _)?

Ответы [ 3 ]

0 голосов
/ 07 августа 2009

Если у вас есть 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;.

0 голосов
/ 07 августа 2009

Спасибо за помощь всем, этот код фактически решил мою проблему:

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]];
}
0 голосов
/ 07 августа 2009

Полностью не проверено. Я даже не знаю, компилируется ли он, но он может привести вас на правильный путь. 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;
  }
}
...