apps app iphone utf-8 nsstring nsstream

app - clips iphone se



NSStream, UTF8String y NSString... Conversión desordenada (2)

Estoy construyendo un paquete de datos para enviar a través de NSStream a un servidor. Estoy tratando de separar dos datos con el a ''§'' (código ascii 167). Esta es la forma en que se construye el servidor, así que tengo que tratar de mantenerme dentro de esos límites ...

unichar asciiChar = 167; //yields @"§" [self setSepString:[NSString stringWithCharacters:&asciiChar length:1]]; sendData=[NSString stringWithFormat:@"USER User%@Pass", sepString]; NSLog(sendData); const uint8_t *rawString=(const uint8_t *)[sendData UTF8String]; [oStream write:rawString maxLength:[sendData length]];

Entonces, el resultado final debería verse así ... y lo hace cuando sendData se construye por primera vez:

USER User§Pass

sin embargo, cuando se recibe del lado del servidor, se ve así:

//not a direct copy and paste. The ''mystery character'' may not be exact USER UserˤPas

... la secuencia del separador se ha convertido en dos de longitud, y la última letra se está recortando desde el comando. Creo que esto se debe a la conversión UTF8.

¿Alguien puede arrojar algo de luz sobre esto para mí?

¡Cualquier ayuda sería muy apreciada!


Lo que tienes y lo que quieres transmitir no es realmente una cadena UTF-8, y técnicamente no es nosotros-ascii, porque eso es solo 7 bits. Desea transmitir una matriz arbitraria de bytes, de acuerdo con el protocolo con el que está trabajando. Los dos campos de la matriz de bytes, nombre de usuario y contraseña, pueden ser cadenas UTF-8, pero con el separador 167 no puede ser una cadena UTF-8.

Aquí hay algunas opciones que veo:

  • Construya la matriz de bytes uint8_t* utilizando al menos dos objetos NSString diferentes más el código 167 . Esto será necesario si el nombre de usuario o la contraseña pueden contener caracteres que no sean ascii.
  • Use el método getBytes:maxLength:usedLength:encoding:options:range:remainingRange y establezca la encoding en NSASCIIStringEncoding . Si hace esto, debe validar en otro lugar que su nombre de usuario y contraseña son us-ascii solamente.
  • Use el método getCString . Sin embargo, eso ha quedado obsoleto porque no puede especificar la codificación que desea.

La codificación correcta en UTF-8 para este personaje es la secuencia de dos bytes 0xC2 0xA7, que es lo que está obteniendo. ( Fileformat.info tiene un valor incalculable para este material.) Esto está fuera del conjunto LATIN-1, por lo que seguramente querrá utilizar NSISOLatin1StringEncoding en lugar de NSUTF8StringEncoding para obtener una codificación 167 de un solo byte. Mire NSString -dataUsingEncoding: