Odpowiedzi:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSStringużywa UTF-16 wewnętrznie, więc może wystąpić niewielki wzrost wydajności, ponieważ nie musi on wykonywać konwersji UTF-16 <-> UTF-8. Osobiście wolimy (jak sugeruje @ gnasher729) solidność od wydajności i używamy UTF-8 wszędzie.
Zrobić:
NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
następnie możesz kontynuować NSJSONSerialization:JSONObjectWithData.
Po komentarzach, oficjalnej dokumentacji i weryfikacjach odpowiedź została zaktualizowana w odniesieniu do usunięcia domniemanego terminatora NULL:
Zgodnie z dokumentacją dataUsingEncoding ::
Zwracana wartość
Wynik wywołania
dataUsingEncoding:allowLossyConversion:z NIE jako drugim argumentem
Zgodnie z dokumentacją getCString: maxLength: encoding: i cStringUsingEncoding ::
zwróć uwagę, że dane zwracane przez
dataUsingEncoding:allowLossyConversion:nie są ścisłym ciągiem C, ponieważ nie ma terminatora NULL
dataUsingEncoding:nie zwraca danych zakończonych zerem. Tylko UTF8Stringinne metody zwracające ciąg C zwracają ciąg zakończony znakiem null.
(note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Musiałem wcześniej to przegapić. Ale na pewno coś napiszę w przyszłości.
cStringUsingEncoding:. dataUsingEncoding:
W przypadku przyjazdu Swift Developer,
przekonwertować z NSString / String na NSData
var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Cel C:
NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Szybki:
let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String
Po pierwsze, powinieneś użyć dataUsingEncoding:zamiast przejść UTF8String. Używasz tylko UTF8Stringwtedy, gdy potrzebujesz Cłańcucha w tym kodowaniu.
Następnie, po UTF-16prostu podaj NSUnicodeStringEncodingzamiast NSUTF8StringEncodingw dataUsingEncoding:wiadomości.
W przypadku Swift 3 przeważnie konwertujesz z Stringna Data.
let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
strzawiera punkty kodu większe niż 127. Jest tak, ponieważ str.lengthpodaje liczbę znaków Unicode, a nie liczbę bajtów. Na przykład, jeśli strjest @"にほんご", str.lengthdaje 4, podczas gdy str.UTF8Stringfaktycznie zawiera 12 bajtów. Nawet jeśli zastąpić str.lengthprzez strlen(str.UTF8String), to nadal będzie źle dla przypadku, gdy strzawiera znak NULL, takich jak @"にほ\0んご".
Cel C:
NSString do NSData:
NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSData do NSString:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
Szybki:
Ciąg do danych:
var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)
Dane do ciągu:
var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Cel C
NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
Szybki
let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)