Risposte:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString
utilizza 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 UTF8String
e 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 UTF8String
quando è necessaria una C
stringa in tale codifica.
Quindi, per UTF-16
, basta passare NSUnicodeStringEncoding
invece che NSUTF8StringEncoding
nel tuo dataUsingEncoding:
messaggio.
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
str
contiene punti di codice maggiori di 127. Questo perché str.length
fornisce il numero di caratteri Unicode, non il numero di byte. Ad esempio, se lo str
è @"にほんご"
, str.length
dà 4 mentre in str.UTF8String
realtà contiene 12 byte. Anche se lo sostituisci str.length
con strlen(str.UTF8String)
, sarà comunque sbagliato nel caso in cui str
contenga 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)