Risposte:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSStringutilizza UTF-16 internamente, quindi potrebbe esserci un leggero aumento delle prestazioni perché non deve eseguire una conversione UTF-16 <-> UTF-8. Personalmente, preferiamo (come suggerisce @ gnasher729) la robustezza rispetto alle prestazioni e usiamo UTF-8 ovunque.
Fare:
NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
quindi sentiti libero di procedere NSJSONSerialization:JSONObjectWithData.
A seguito dei commenti, della documentazione ufficiale e delle verifiche , questa risposta è stata aggiornata per quanto riguarda la rimozione di un presunto terminatore NULL:
Come documentato da dataUsingEncoding ::
Valore di ritorno
Il risultato dell'invocazione
dataUsingEncoding:allowLossyConversion:con NO come secondo argomento
Come documentato da getCString: maxLength: encoding: e cStringUsingEncoding ::
si noti che i dati restituiti da
dataUsingEncoding:allowLossyConversion:non sono una stringa C rigorosa poiché non hanno un terminatore NULL
dataUsingEncoding:non restituisce dati con terminazione null. Solo UTF8Stringe altri metodi che restituiscono una stringa C restituiscono una stringa con terminazione null.
(note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Devo averlo perso prima. Sarò sicuro di scrivere qualsiasi cosa in futuro, però.
cStringUsingEncoding:. Stavo guardando sotto dataUsingEncoding:.)
Nel caso in cui Swift Developer venga qui,
per convertire da NSString / String a NSData
var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Objective-C:
NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Swift:
let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String
Prima di tutto, dovresti usare dataUsingEncoding:invece di passare attraverso UTF8String. Si utilizza solo UTF8Stringquando è necessaria una Cstringa in tale codifica.
Quindi, per UTF-16, basta passare NSUnicodeStringEncodinginvece che NSUTF8StringEncodingnel tuo dataUsingEncoding:messaggio.
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
strcontiene punti di codice maggiori di 127. Questo perché str.lengthfornisce il numero di caratteri Unicode, non il numero di byte. Ad esempio, se lo strè @"にほんご", str.lengthdà 4 mentre in str.UTF8Stringrealtà contiene 12 byte. Anche se lo sostituisci str.lengthcon strlen(str.UTF8String), sarà comunque sbagliato nel caso in cui strcontenga il carattere NULL, ad esempio @"にほ\0んご".
Objective-C:
Da NSString a NSData:
NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSData a NSString:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
Swift:
String to Data:
var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)
Dati su stringa:
var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Objective-C
NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
veloce
let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)