Odpowiedzi:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString
uż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 UTF8String
inne 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 UTF8String
wtedy, gdy potrzebujesz C
łańcucha w tym kodowaniu.
Następnie, po UTF-16
prostu podaj NSUnicodeStringEncoding
zamiast NSUTF8StringEncoding
w dataUsingEncoding:
wiadomości.
W przypadku Swift 3 przeważnie konwertujesz z String
na 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];
str
zawiera punkty kodu większe niż 127. Jest tak, ponieważ str.length
podaje liczbę znaków Unicode, a nie liczbę bajtów. Na przykład, jeśli str
jest @"にほんご"
, str.length
daje 4, podczas gdy str.UTF8String
faktycznie zawiera 12 bajtów. Nawet jeśli zastąpić str.length
przez strlen(str.UTF8String)
, to nadal będzie źle dla przypadku, gdy str
zawiera 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)