Antworten:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSStringintern UTF-16, sodass möglicherweise ein geringfügiger Leistungsgewinn erzielt wird, da keine UTF-16 <-> UTF-8-Konvertierung durchgeführt werden muss. Persönlich bevorzugen wir (wie @ gnasher729 vorschlägt) Robustheit gegenüber Leistung und verwenden UTF-8 überall.
Tun:
NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
Dann können Sie fortfahren NSJSONSerialization:JSONObjectWithData.
Nach den Kommentaren, offiziellen Unterlagen und Überprüfungen wurde diese Antwort hinsichtlich der Entfernung eines mutmaßlichen NULL-Terminators aktualisiert:
Wie durch dokumentiert dataUsingEncoding: :
Rückgabewert
Das Ergebnis des Aufrufs
dataUsingEncoding:allowLossyConversion:mit NO als zweitem Argument
Wie durch dokumentiert getCString: maxLength: Codierung: und cStringUsingEncoding: :
Beachten Sie, dass die von zurückgegebenen Daten
dataUsingEncoding:allowLossyConversion:keine strikte C-Zeichenfolge sind, da sie keinen NULL-Terminator haben
dataUsingEncoding:gibt keine nullterminierten Daten zurück. Nur UTF8Stringund andere Methoden, die eine C-Zeichenfolge zurückgeben, geben eine nullterminierte Zeichenfolge zurück.
(note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Ich muss das früher verpasst haben. Ich werde aber in Zukunft sicher alles aufschreiben.
cStringUsingEncoding:. Ich habe unter gesucht dataUsingEncoding:.)
Falls Swift Developer hierher kommt,
von NSString / String nach NSData konvertieren
var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Ziel c:
NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Schnell:
let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String
Zunächst sollten Sie verwenden, dataUsingEncoding:anstatt durchzugehen UTF8String. Sie werden nur verwendet, UTF8Stringwenn Sie eine CZeichenfolge in dieser Codierung benötigen .
Dann übergeben Sie UTF-16einfach NSUnicodeStringEncodingstatt NSUTF8StringEncodingin Ihrer dataUsingEncoding:Nachricht.
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
strCodepunkte größer als 127 enthalten sind. Dies liegt daran, dass str.lengthdie Anzahl der Unicode-Zeichen und nicht die Anzahl der Bytes angegeben wird. Wenn dies der Fall strist @"にほんご", str.lengthergibt dies 4, während es str.UTF8Stringtatsächlich 12 Bytes enthält. Auch wenn Sie ersetzen str.lengthdurch strlen(str.UTF8String), wird es noch für den Fall falsch sein , wenn strdas NULL - Zeichen enthält, wie zum Beispiel @"にほ\0んご".
Ziel c:
NSString zu NSData:
NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSData to NSString:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
Schnell:
Zeichenfolge zu Daten:
var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)
Daten zu String:
var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Ziel c
NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
Schnell
let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)