Wie konvertiere ich einen NSString-Wert in NSData?


Antworten:


1419
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

Was sind die Vor- und Nachteile der Verwendung von UTF-8 im Gegensatz zu etwas Höherem wie UTF-16 oder UTF-32?
Albert Renshaw

4
Den NSData ist es egal, ob es sich um UTF-8 oder UTF-16 oder UTF-32 handelt. Es gibt zwei Probleme: Zum einen müssen UTF-16 und UTF-32 die richtige Bytereihenfolge haben. Zweitens muss jeder, der es wieder in einen NSString * konvertiert, die Codierung kennen und wird häufig die UTF-8-Codierung annehmen. Im Allgemeinen wird UTF-8 höchstwahrscheinlich korrekt behandelt.
Gnasher729

1
@bendytree eigentlich nein, das tut es nicht, -dataUsingEncoding: gibt eine nicht nullterminierte Zeichenfolge zurück, was stringWithUTF8String: erfordert, Sie müssen den Speicher lesen, den Sie nicht möchten. Was es zurück konvertiert, ist: -initWithData: encoding:.
Psycho

1
@Albert Renshaw verwendet derzeit (keine Garantie dafür, dass dies so bleibt) 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.
Einige Entwickler

66
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

Sie können auf diesen Link verweisen


3
Einzeiler-Lösung:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Raptor

32

Tun:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

Dann können Sie fortfahren NSJSONSerialization:JSONObjectWithData.


Korrektur der Antwort bezüglich des NULL-Terminators

Nach den Kommentaren, offiziellen Unterlagen und Überprüfungen wurde diese Antwort hinsichtlich der Entfernung eines mutmaßlichen NULL-Terminators aktualisiert:

  1. Wie durch dokumentiert dataUsingEncoding: :

    Rückgabewert

    Das Ergebnis des Aufrufs dataUsingEncoding:allowLossyConversion:mit NO als zweitem Argument

  2. 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


14
Das ist falsch! Bitte sehen Sie meinen Beitrag hier: stackoverflow.com/q/14087094/192819
jpswain

4
Jep. dataUsingEncoding:gibt keine nullterminierten Daten zurück. Nur UTF8Stringund andere Methoden, die eine C-Zeichenfolge zurückgeben, geben eine nullterminierte Zeichenfolge zurück.
Peter Hosey

@PeterHosey hast du eine Quelle dafür? Es fällt mir schwer, das in irgendwelchen Dokumenten zu finden.
Shortstuffsushi

1
Dank @PeterHosey, die Dokumentation verknüpft Sie es tun explizit das Fehlen von NULL Kündigung angeben , - (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.
Shortstuffsushi

1
(Für alle, die sich fragen: Shortstuffsushis Zitat ist unter cStringUsingEncoding:. Ich habe unter gesucht dataUsingEncoding:.)
Peter Hosey

20

Falls Swift Developer hierher kommt,

von NSString / String nach NSData konvertieren

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

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

Wahrscheinlich prozessorintensiv im Vergleich zu den anderen Methoden, aber sehr nützlich, wenn Sie aus Gründen der Persistenz auf das Dateisystem zugreifen
Stephen J

10

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.


7

Bei Swift 3 konvertieren Sie hauptsächlich von Stringnach Data.

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)

6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];

5
Diese Antwort ist falsch, wenn 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んご".
Pang

Ein auf diese Weise erstelltes NSData-Objekt löst bei Verwendung mit [NSJSONSerialization JSONObjectWithData: Datenoptionen: NSJSONReadingMutableLeaves error: & error] eine Ausnahme aus.
Adobels

2

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!

1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];

0

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.