Pregunta

Estoy creando un paquete de datos que se enviará a través de NSStream a un servidor. Estoy tratando de separar dos datos con la '& # 167;' (código ascii 167). Esta es la forma en que se construye el servidor, así que debo intentar 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]];  

Por lo tanto, el resultado final debe tener este aspecto ... y lo hace cuando se construye sendData por primera vez:

USER User§Pass 

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

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

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

¿Puede alguien arrojar algo de luz sobre esto por mí?

Cualquier ayuda sería muy apreciada!

¿Fue útil?

Solución

La codificación correcta en UTF-8 para este carácter es la secuencia de dos bytes 0xC2 0xA7, que es lo que está obteniendo. ( Fileformat.info es invaluable para estas cosas.) Esto es fuera del conjunto LATIN-1, por lo que es casi seguro que desee utilizar NSISOLatin1StringEncoding en lugar de NSUTF8StringEncoding para obtener una codificación 167 de un solo byte. Mire NSString -dataUsingEncoding: .

Otros consejos

Lo que tienes y lo que quieres transmitir no es realmente una cadena UTF-8, y técnicamente no es nosotros-ascii, porque son 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, podrían 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 NSString getBytes: maxLength: usedLength: encoding: options: range: restantesRange y configure encoding en NSASCIIStringEncoding . Si hace esto, debe validar en otro lugar que su nombre de usuario y contraseña son solo nosotros-ascii.
  • Utilice el método NSString getCString . Sin embargo, está en desuso porque no puede especificar la codificación que desea.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top