Yanıtlar:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString
dahili olarak UTF-16 kullanıyor, bu nedenle UTF-16 <-> UTF-8 dönüşümü yapmak zorunda olmadığı için küçük bir performans kazancı olabilir. Şahsen, performans üzerinde sağlamlığı tercih ediyoruz (@ gnasher729'un önerdiği gibi) ve her yerde UTF-8 kullanıyoruz.
Yapmak:
NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
o zaman devam etmekte özgürsün NSJSONSerialization:JSONObjectWithData
.
Yorumların, resmi belgelerin ve doğrulamaların ardından, NULL olduğu iddia edilen bir sonlandırıcının kaldırılmasıyla ilgili bu cevap güncellendi:
DataUsingEncoding tarafından belgelendiği gibi :
Geri dönüş değeri
dataUsingEncoding:allowLossyConversion:
İkinci argüman olarak NO ile çağrılmanın sonucu
GetCString: maxLength: encoding: and cStringUsingEncoding: tarafından belgelendiği gibi :
NULL sonlandırıcısı olmadığı için döndürülen verilerin
dataUsingEncoding:allowLossyConversion:
katı bir C-dizesi olmadığını unutmayın
dataUsingEncoding:
boş sonlandırılmış veriler döndürmez. Yalnızca UTF8String
ve bir C dizesi döndüren diğer yöntemler boş değerli bir dizge döndürür.
(note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator)
. Bunu daha önce özlemeliydim. Yine de gelecekte bir şey yazacağımdan emin olacağım.
cStringUsingEncoding:
. Ben bakıyordum dataUsingEncoding:
.)
Swift Geliştirici'nin buraya gelmesi durumunda,
/ String için NSData dönüştürmek için
var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Objective-C:
NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Swift:
let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String
İlk önce, dataUsingEncoding:
geçmek yerine kullanmalısınız UTF8String
. Yalnızca bu kodlamada UTF8String
bir C
dizeye ihtiyacınız olduğunda kullanılır .
Ardından için UTF-16
, sadece geçmesi NSUnicodeStringEncoding
yerine NSUTF8StringEncoding
sizin de dataUsingEncoding:
mesajın.
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
str
127'den büyük kod noktaları içerdiğinde bu yanıt yanlıştır. Bunun nedeni str.length
bayt sayısını değil Unicode karakter sayısını vermesidir. Örneğin, str
bir @"にほんご"
, str.length
süre 4'ü verir str.UTF8String
aslında 12 bayt içerir. Değiştirmeye bile str.length
tarafından strlen(str.UTF8String)
, yine de durum için yanlış olacaktır str
gibi NULL karakteri içerir @"にほ\0んご"
.
Objective-C:
NSData'ya NSString:
NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSData'dan NSString'e:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
Swift:
Veri Dizesi:
var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)
Dizeye Veriler:
var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Objective-C
NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
hızlı
let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)