Pergunta

NSXMLParserInvalidCharacterError # 9

Este é o erro que recebo quando eu bati um personagem estranho (como citações copiado e colado de palavra para o formulário web, que acabam na alimentação). A alimentação que estou usando não está dando uma codificação, e sua não é uma esperança para mim para levá-los a mudar isso. Isto é tudo que eu vejo no cabeçalho:

O que posso fazer sobre caracteres ilegais ao analisar feeds? Faço para varrer os dados anteriores da análise? Existe algo que eu estou ausente na API? Qualquer pessoa tem lidado com essa questão?

Foi útil?

Solução

NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease];

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

Fixed meus problemas ...

Outras dicas

O NSString método -initWithData:encoding: retornos nil se ele falhar, então você pode tentar uma codificação após o outro até encontrar um que convertidos. Isso não garante que você vai converter todos os caracteres corretamente, mas se sua fonte de alimentação não está enviando XML codificado corretamente, então você provavelmente vai ter que viver com isso.

A idéia básica é:

// try the most likely encoding
NSString xmlString = [[NSString alloc] initWithData:xmlData 
                                           encoding:NSUTF8StringEncoding];

if (xmlString == nil) {
  // try the next likely encoding
  xmlString = [[NSString alloc] initWithData:xmlData 
                                     encoding:NSWindowsCP1252StringEncoding];
}

if (xmlString == nil) {
  // etc...
}

Para ser genérico e robusto, você pode fazer o seguinte até bem sucedida:

1). Tente a codificação especificada no cabeçalho Content-Type da resposta HTTP (se houver)

2.) Verifique o início dos dados de resposta para um byte order mark e, se for encontrado, tente a codificação indicada

3) Olhe para os dois primeiros bytes.; se você encontrar um espaço em branco ou '<' emparelhado com um nul / personagem zero, tentativa UTF-16 (da mesma forma, você pode verificar os primeiros quatro bytes para ver se você tem UTF-32)

4) Digitalizar o início dos dados que procuram a instrução de processamento <?xml ... ?> e olhar para encoding='something' dentro dela.; tente essa codificação.

5). Tente algumas codificações comuns. Definitivamente verificar o Windows Latin-1, Mac Roman, e ISO Latin-1 se a sua fonte de dados está em Inglês.

6.) Se nenhum dos trabalhos acima, você pode tentar remover todos os bytes maior que 127 (ou substituto '?' Ou outro personagem ASCII) e converter os dados usando a codificação ASCII.

Se você não tem um NSString por este ponto, você deve falhar. Se você tem um NSString, você deve olhar para a declaração encoding na instrução de processamento <?xml ... ?> (se você já não o fez no passo 4). Se ele está lá, você deve converter a volta NSString para NSData usando esse tipo de codificação; se ele não estiver lá, você deve converter de volta usando a codificação UTF-8.

Além disso, as funções CFStringConvertIANACharSetNameToEncoding() e CFStringConvertEncodingToNSStringEncoding() pode ajudar a obter o NSStringEncoding que se passa com a forma nome de codificação no cabeçalho Content-Type ou a instrução de processamento <?xml ... ?>.

Você também pode remover essa linha de codificação de XML como este:

int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
                        withString:@""
                        options:NSRegularExpressionSearch 
                        range:NSMakeRange(0, length)];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top