Ответы:
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:
Как задокументировано dataUsingEncoding :
Возвращаемое значение
Результат вызова
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)
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
Прежде всего, вы должны использовать dataUsingEncoding:
вместо прохождения UTF8String
. Вы используете только UTF8String
тогда, когда вам нужноC
строка в этой кодировке.
Тогда UTF-16
просто пройдите NSUnicodeStringEncoding
вместо NSUTF8StringEncoding
вашего dataUsingEncoding:
сообщения.
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
str
содержит кодовые точки больше 127. Это потому, что str.length
дает количество символов Юникода, а не количество байтов. Например, если str
есть @"にほんご"
, str.length
дает 4, а на str.UTF8String
самом деле содержит 12 байтов. Даже если вы замените str.length
на strlen(str.UTF8String)
, это все равно будет неправильно для случая, когда str
содержит символ NULL, например @"にほ\0んご"
.
Objective-C:
NSString to NSData:
NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSData to NSString:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
Swift:
Строка для данных:
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];
Objective-C
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)