Відповіді:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSStringвикористовує UTF-16 внутрішньо, тому може бути невеликий приріст продуктивності, оскільки він не повинен робити перетворення UTF-16 <-> UTF-8. Особисто ми вважаємо за краще (як @ gnasher729 пропонує) надійність над продуктивністю та використовуємо UTF-8 скрізь.
Зробіть:
NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
то сміливо продовжуйте NSJSONSerialization:JSONObjectWithData.
Після коментарів, офіційної документації та перевірок , ця відповідь була оновлена стосовно вилучення імовірного термінатора NULL:
Як задокументовано данимиUsingEncoding ::
Повернене значення
Результат виклику
dataUsingEncoding:allowLossyConversion:NO як другого аргументу
Як задокументовано getCString: maxLength: encoding: і cStringUsingEncoding ::
зауважте, що дані, що повертаються,
dataUsingEncoding:allowLossyConversion:не є строгим C-рядком, оскільки він не має термінала NULL
dataUsingEncoding:не повертає недійсні дані. Тільки UTF8Stringй інші методи, що повертають рядок C, повертають нульову завершену рядок.
(note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Я, мабуть, пропустив це раніше. Я обов'язково напишу щось у майбутньому.
cStringUsingEncoding:. Я переглядав dataUsingEncoding:.)
У випадку, коли сюди заходить Swift Developer,
конвертувати з NSString / String в NSData
var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Завдання-C:
NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Швидкий:
let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String
По-перше, ви повинні використовувати dataUsingEncoding:замість того, щоб пройти UTF8String. Ви використовуєте лише UTF8Stringтоді, коли вам потрібна Cрядок у кодуванні.
Тоді для цього UTF-16просто передайте NSUnicodeStringEncodingзамість NSUTF8StringEncodingсвого dataUsingEncoding:повідомлення.
Для Swift 3 ви в основному будете переходити Stringдо 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містить кодові точки, що перевищують 127. Це пояснюється тим, що str.lengthдає кількість символів Unicode, а не кількість байтів. Наприклад, якщо strє @"にほんご", str.lengthдає 4, а str.UTF8Stringнасправді містить 12 байт. Навіть якщо ви заміните str.lengthна strlen(str.UTF8String), це все одно буде неправильним для випадку, коли strмістить символ NULL, наприклад @"にほ\0んご".
Завдання-C:
NSString до NSData:
NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSData до NSString:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
Швидкий:
Рядок до даних:
var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)
Дані для рядків:
var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Ціль-С
NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
Швидкий
let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)