NSStream, UTF8String & amp; NSString ... Conversazione disordinata
Domanda
Sto costruendo un pacchetto di dati da inviare su NSStream a un server. Sto cercando di separare due parti di dati con un '§' (codice ascii 167). Questo è il modo in cui è costruito il server, quindi devo cercare di rimanere entro quei limiti ...
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]];
Quindi il risultato finale dovrebbe assomigliare a questo ... e lo fa quando sendData viene costruito per la prima volta:
USER User§Pass
tuttavia, quando viene ricevuto sul lato server, si presenta così:
//not a direct copy and paste. The 'mystery character' may not be exact
USER UserˤPas
... la stringa del separatore è diventata due in lunghezza e l'ultima lettera viene tagliata dal comando. Credo che ciò sia dovuto alla conversione UTF8.
Qualcuno può far luce su questo per me?
Qualsiasi aiuto sarebbe molto apprezzato!
Soluzione
La codifica corretta in UTF-8 per questo personaggio è la sequenza a due byte 0xC2 0xA7, che è ciò che stai ricevendo. ( Fileformat.info è prezioso per questa roba.) Questo è dal set LATIN-1, quindi quasi sicuramente si desidera utilizzare NSISOLatin1StringEncoding anziché NSUTF8StringEncoding per ottenere una codifica 167 a byte singolo. Guarda NSString -dataUsingEncoding:
.
Altri suggerimenti
Quello che hai e quello che vuoi trasmettere non è in realtà una stringa UTF-8, e tecnicamente non è noi-ascii, perché sono solo 7 bit. Vuoi trasmettere un array arbitrario di byte, secondo il protocollo con cui stai lavorando. I due campi dell'array di byte, nome utente e password, potrebbero essere essi stessi stringhe UTF-8, ma con il separatore 167
non può essere una stringa UTF-8.
Ecco alcune opzioni che vedo:
- Costruisci l'array di byte
uint8_t *
usando almeno due diversi oggettiNSString
più il codice167
. Ciò sarà necessario se il nome utente o la password possono contenere caratteri non ascii. - Utilizza il metodo
NSString
getBytes: maxLength: usedLength: codifica: opzioni: range: rimanendoRange
e impostacodifica
suNSASCIIStringEncoding
. Se lo fai devi confermare altrove che il tuo nome utente e la tua password sono solo noi-ascii. - Utilizza il metodo
NSString
getCString
. Tuttavia, è stato deprecato perché non è possibile specificare la codifica desiderata.