Pregunta

NSXMLParserInvalidCharacterError n.º 9

Este es el error que aparece cuando encuentro un carácter extraño (como citas copiadas y pegadas de Word al formulario web, que terminan en el feed).El feed que estoy usando no proporciona una codificación y no tengo ninguna esperanza de lograr que cambien eso.Esto es todo lo que me sale en el encabezado:

<? xml versión = "1.0"?> <rss versión = "2.0">

¿Qué puedo hacer con los caracteres ilegales al analizar feeds?¿Barro los datos antes del análisis?¿Hay algo que me falta en la API?¿Alguien se ha ocupado de este problema?

¿Fue útil?

Solución

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

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

Solucionó mis problemas ...

Otros consejos

La cadena NS -initWithData:encoding: el método devuelve nil si falla, puedes probar una codificación tras otra hasta que encuentres una que convierta.Esto no garantiza que convertirás todos los caracteres correctamente, pero si la fuente de tu feed no te envía XML codificado correctamente, probablemente tendrás que vivir con ello.

La idea básica es:

// 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 y sólido, puede hacer lo siguiente hasta tener éxito:

1.) Pruebe la codificación especificada en el encabezado Content-Type de la respuesta HTTP (si corresponde)

2.) Verifique el inicio de los datos de respuesta para un marca de orden de bytes y si lo encuentra, pruebe con la codificación indicada.

3.) Mire los dos primeros bytes;Si encuentra un carácter de espacio en blanco o '<' emparejado con un carácter nulo/cero, pruebe con UTF-16 (de manera similar, puede verificar los primeros cuatro bytes para ver si tiene UTF-32)

4.) Escanee el inicio de los datos buscando el <?xml ... ?> procesar instrucciones y buscar encoding='something' dentro de eso;prueba esa codificación.

5.) Pruebe algunas codificaciones comunes.Definitivamente verifique Windows Latin-1, Mac Roman e ISO Latin-1 si su fuente de datos está en inglés.

6.) Si nada de lo anterior funciona, puede intentar eliminar todos los bytes mayores a 127 (o sustituir '?' u otro carácter ASCII) y convertir los datos usando la codificación ASCII.

Si no tiene un NSString en este momento, debería fallar.Si tiene un NSString, debe buscar el encoding declaración en el <?xml ... ?> instrucciones de procesamiento (si aún no lo hizo en el paso 4).Si está ahí, debes convertir NSString nuevamente a NSData usando esa codificación;si no está ahí, debes volver a convertir usando la codificación UTF-8.

También el CFStringConvertIANACharSetNameToEncoding() y CFStringConvertEncodingToNSStringEncoding() Las funciones pueden ayudar a obtener el NSStringEncoding que va con el nombre de codificación del Content-Type encabezado o el <?xml ... ?> instrucción de procesamiento.

También puede eliminar esa línea de codificación de xml como esta:

int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
                        withString:@""
                        options:NSRegularExpressionSearch 
                        range:NSMakeRange(0, length)];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top