El problema que nos hemos encontrado es que los carácteres especiales, los que no forman parte de la tabla ASCII original, se visualizan incorrectamente, esto es debido a que al crear la cadena a partir del mensaje recibido hay que especificar la codificación en que este se creó. Sabemos que ésta será UTF8 ya que el servicio que consumimos es una servicio WCF de .NET, entonces, como lo podríamos hacer?
La verdad es que justo estoy empezando a programar para iPhone y no estoy muy familiarizado con la sintaxis de Objective-C ni el framework en general, así que me ha costado dar con la solucion ya que hay infinidad de maneras de construir una cadena mediante la clase NSString.
Inicialmente teníamos un código como el que sigue:
UInt8 buffer[2048];
CFIndex bytesRead = CFReadStreamRead(_stream, buffer, sizeof(buffer));
if(bytesRead > 0)
{
NSString* msg = [NSString stringWithCString: (char*)buffer length: bytesRead];
}
En este caso no se le está especificando la codificación y es por eso que no funciona correctamente con los carácteres no ASCII estándard, por lo tanto hay que buscar otra manera. La primera idea era mirar el método stringWithUTF8String, pero, sorpresa! este no nos deja especificar la longitud de los datos de entrada que le proporcionamos en forma de array de bytes, y en nuestro caso es necesario ya que no podemos garantizar que termine con un byte nulo que es lo que requiere este método (sino no leerá bien y retornará un resultado nulo). Finalmente después de consultar bastantes foros se hace la luz:
NSString* msg = [[NSString alloc] initWithBytes:buffer length: bytesRead encoding: NSUTF8StringEncoding];
De esta manera por fin obtenemos la cadena de texto correctamente.




