2009-12-18 20 views
20

Así que estoy ir a buscar una cadena JSON desde un script php en mi aplicación para el iPhone usando:Problema de codificación: Cocoa Error 261?

NSURL *baseURL = [NSURL URLWithString:@"test.php"]; 
NSError *encodeError = [[NSError alloc] init]; 
NSString *jsonString = [NSString stringWithContentsOfURL:baseURL encoding:NSUTF8StringEncoding error:&encodeError]; 
NSLog(@"Error: %@", [encodeError localizedDescription]); 
NSLog(@"STRING: %@", jsonString); 

La cadena JSON valida cuando pruebo la salida. Ahora estoy teniendo un problema de codificación. Cuando voy a buscar una sola línea echo'd tales como:

{ "testKey":"é" } 

El analizador JSON funciona bien y soy capaz de crear un objeto JSON válida. Sin embargo, cuando voy a buscar mi cadena JSON 2MB, consigo presentado con:

Error: Operation could not be completed. (Cocoa error 261.) 

y una cadena nula. Mi archivo PHP es UTF8 en sí y no estoy usando utf8_encode() porque parece codificar doblemente los datos ya que ya estoy extrayendo los datos como NSUTF8StringEncoding. De cualquier manera, en mi prueba de eco único, es el enfoque que me permitió registrar con éxito el estilo \ ASDAS UTF8 escapa al construir el objeto JSON.

¿Qué podría estar causando el error en el caso de la cadena más grande?

Además, no estoy seguro de si hace la diferencia, pero estoy usando la función php addslashes() en mis datos php analizados para contabilizar las comillas y cosas así al compilar la cadena JSON.

Respuesta

19

No sé si este es su problema, pero acabo de tener algo similar (stringWithContentsOfFile, no JSON), y el problema era que el archivo tenía terminaciones de línea CRLF (windows) y Western-lo que sea- es- llamada codificación Utilicé SubEthaEdit para convertir a LF (terminaciones de línea Mac/Unix) y codificación UTF-8, y ahora todo funciona bien.

+0

También puede ser útil para examinar el tipo de codificación de archivo. Usé Text Wrangler para hacer esto. Abra el archivo y en la parte inferior de la ventana se mostrará qué tipo de codificación es. Necesitaba UTF16 pero hay muchas variaciones. – TigerCoding

0

Para futuras referencias, si necesita sobreescribir la codificación, y está trabajando con streams sin NULs incrustados, algo como esto podría ser bueno (Acabo de escribir un boceto esquemático aquí, compruebe que este código es y quiere que usted quiere antes de usarlo):

NSHTTPURLResponse* resp=nil; 
NSData* jsonAsImmutableData = [NSURLConnection sendSynchronousRequest: 
    [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://<whatever>"]] 
    returningResponse:&resp error:NULL]; 

NSMutableData*modifiedData = [NSMutableData dataWithData:jsonAsImmutableData]; 

char extraNulls[7] = 
    {0,0,0,0,0,0,0}; // is this defensive enough for your encoding? 
[modifiedData appendBytes:extraNulls length:7]; 

NSString* jsonAsString = [NSString stringWithCString:[modifiedData bytes] 
    encoding:<whatever your encoding is>]; 

Pero espero que el mejor curso de acción es comprobar que su servidor es a la vez usando y que afirma utilizar codificación UTF-8 o algún otro tipo de codificación soportado iPhone de Apple.

EDIT

cambio de código comentario.

+0

No estoy muy seguro de entender lo que quiere decir con bastante defensiva, o lo que esto está logrando adicional ... podría elaborar un poco más, por favor? –

+0

oh si su codificación es de 32 bits (ej. UTF32) en lugar de 8bit caracteres, para obtener un final de 32bits todo nulo (para terminar la cadena C, requerido por la cadenaWithCString: llamada API) solo se puede garantizar agregando 7 NUL caracteres (se necesitan 4 si están perfectamente alineados, se necesitan 3 adicionales en el peor de los casos de desalineación). Si solo se trata de una codificación ASCII de 8 bits, será suficiente con 1 byte NUL, pero me quedé más porque no sé qué codificación está utilizando. – martinr

+0

Por supuesto, me refiero a ASCII de EE. UU. Con alto bit claro (por lo tanto, códigos de 7 bits en un byte de ocho bits). Y no estoy seguro de cuántos bytes nulos se requieren realmente, incluso para UTF32. Te estoy entregando un cheque para que compruebes tu codificación (particular). Gracias..! – martinr

27

Me sorprende que nadie haya mencionado el uso de un valor de codificación diferente en lugar de NSUTF8StringEncoding al llamar a [NSString stringWithContentsOfFile: encoding: error:].

También obtuve el error Cocoa 261 al analizar un archivo JSON. Acabo de revisar la lista de NSString encodings hasta que funcionó. Afortunadamente, el primero me funcionó: ¡NSASCIIStringEncoding!

También puede usar NSString stringWithContentsOfFile:usedEncoding:error: para tratar de encontrar la codificación correcta (como se describe aquí: How to use stringWithContentsOfURL:encoding:error:?).

+0

Eso fue totalmente mi problema. El problema que tengo con la respuesta aceptada es que es posible que no tenga la capacidad de cambiar el archivo de entrada. –

+0

Estoy de acuerdo en que es posible que no pueda cambiar el archivo de entrada. Mi punto era: el problema no es sobre json (o php), se trata de codificaciones de cuerdas. Cambié el archivo, pero también se puede cambiar el valor de codificación NS. – Olie

0

Lo que me ayudó fue simplemente cambiar la codificación del archivo físico a UTF-8. Mi editor lo había configurado de forma predeterminada, MacRoman, y no me gustaban las letras con acentos.

5

Problema de codificación: Cocoa Error 261? He resuelto este problema probando una codificación diferente. Primero estaba usando NSUTF8 luego I cambiado a NSASCIIStringEncoding y funcionó.

NSString* path = [[NSBundle mainBundle] pathForResource: @"fileName" ofType: @"type"]; 
NSData* data = [NSData dataWithContentsOfFile:path]; 
NSString *string = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
NSLog(@"%@",string); 
+0

Está cambiando el contenido del archivo ... – chaaruu

Cuestiones relacionadas