Jawaban:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString
menggunakan 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 UTF8String
dan 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 UTF8String
saat Anda membutuhkan C
string dalam pengkodean itu.
Kemudian, untuk UTF-16
, hanya lewat NSUnicodeStringEncoding
alih-alih NSUTF8StringEncoding
dalam dataUsingEncoding:
pesan Anda .
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
str
berisi poin kode lebih besar dari 127. Ini karena str.length
memberikan jumlah karakter Unicode, bukan jumlah byte. Misalnya, jika str
adalah @"にほんご"
, str.length
memberikan 4 sementara str.UTF8String
sebenarnya mengandung 12 byte. Meskipun Anda menggantinya str.length
dengan strlen(str.UTF8String)
, itu akan tetap salah untuk kasus di mana str
berisi 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)