Antworten:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString
intern 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 UTF8String
und 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, UTF8String
wenn Sie eine C
Zeichenfolge in dieser Codierung benötigen .
Dann übergeben Sie UTF-16
einfach NSUnicodeStringEncoding
statt NSUTF8StringEncoding
in Ihrer dataUsingEncoding:
Nachricht.
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
str
Codepunkte größer als 127 enthalten sind. Dies liegt daran, dass str.length
die Anzahl der Unicode-Zeichen und nicht die Anzahl der Bytes angegeben wird. Wenn dies der Fall str
ist @"にほんご"
, str.length
ergibt dies 4, während es str.UTF8String
tatsächlich 12 Bytes enthält. Auch wenn Sie ersetzen str.length
durch strlen(str.UTF8String)
, wird es noch für den Fall falsch sein , wenn str
das 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)