Jawaban:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSStringmenggunakan UTF-16 secara internal sehingga mungkin ada sedikit peningkatan kinerja karena tidak harus melakukan konversi UTF-16 <-> UTF-8. Secara pribadi, kami lebih suka (seperti yang disarankan @ gnasher729) daripada kinerja dan menggunakan UTF-8 di mana-mana.
Melakukan:
NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
maka jangan ragu untuk melanjutkan NSJSONSerialization:JSONObjectWithData.
Mengikuti komentar, dokumentasi resmi, dan verifikasi , jawaban ini diperbarui sehubungan dengan penghapusan dugaan terminator NULL:
Seperti yang didokumentasikan oleh dataUsingEncoding ::
Nilai Pengembalian
Hasil dari pemanggilan
dataUsingEncoding:allowLossyConversion:dengan NO sebagai argumen kedua
Seperti yang didokumentasikan oleh getCString: maxLength: encoding: and cStringUsingEncoding ::
perhatikan bahwa data yang dikembalikan oleh
dataUsingEncoding:allowLossyConversion:bukan string-C yang ketat karena tidak memiliki terminator NULL
dataUsingEncoding:tidak mengembalikan data yang dihentikan nol. Hanya UTF8Stringdan metode lain yang mengembalikan string C mengembalikan string yang diakhiri null.
(note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Saya pasti melewatkan ini sebelumnya. Saya pasti akan menulis apa pun di masa depan.
cStringUsingEncoding:. Saya mencari di bawah dataUsingEncoding:.)
Seandainya Pengembang Swift datang ke sini,
untuk mengkonversi dari NSString / String ke NSData
var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Tujuan-C:
NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Cepat:
let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String
Pertama, Anda harus menggunakan dataUsingEncoding:alih-alih melalui UTF8String. Anda hanya menggunakan UTF8Stringsaat Anda membutuhkan Cstring dalam pengkodean itu.
Kemudian, untuk UTF-16, hanya lewat NSUnicodeStringEncodingalih-alih NSUTF8StringEncodingdalam dataUsingEncoding:pesan Anda .
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
strberisi poin kode lebih besar dari 127. Ini karena str.lengthmemberikan jumlah karakter Unicode, bukan jumlah byte. Misalnya, jika stradalah @"にほんご", str.lengthmemberikan 4 sementara str.UTF8Stringsebenarnya mengandung 12 byte. Meskipun Anda menggantinya str.lengthdengan strlen(str.UTF8String), itu akan tetap salah untuk kasus di mana strberisi karakter NULL, seperti @"にほ\0んご".
Tujuan-C:
NSString ke NSData:
NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSData ke NSString:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
Cepat:
String ke Data:
var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)
Data ke String:
var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Objektif-C
NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
Cepat
let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)