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!

È stato utile?

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 oggetti NSString più il codice 167 . 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 imposta codifica su NSASCIIStringEncoding . 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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top