Відповіді:
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)