Respostas:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString
usa o UTF-16 internamente, portanto pode haver um pequeno ganho de desempenho, porque ele não precisa fazer uma conversão UTF-16 <-> UTF-8. Pessoalmente, preferimos (como @ gnasher729 sugere) a robustez ao desempenho e usamos o UTF-8 em qualquer lugar.
Faz:
NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
então fique à vontade para prosseguir NSJSONSerialization:JSONObjectWithData
.
Após os comentários, a documentação oficial e as verificações , esta resposta foi atualizada com relação à remoção de um suposto terminador NULL:
Conforme documentado por dataUsingEncoding ::
Valor de retorno
O resultado da chamada
dataUsingEncoding:allowLossyConversion:
com NO como o segundo argumento
Conforme documentado por getCString: maxLength: encoding: e cStringUsingEncoding ::
observe que os dados retornados por
dataUsingEncoding:allowLossyConversion:
não são uma string C estrita, pois não possuem um terminador NULL
dataUsingEncoding:
não retorna dados terminados em nulo. Somente UTF8String
e outros métodos que retornam uma string C retornam uma string terminada em nulo.
(note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator)
. Eu devo ter perdido isso antes. Certificarei de escrever qualquer coisa no futuro, no entanto.
cStringUsingEncoding:
eu estava olhando para baixo. dataUsingEncoding:
.)
No caso do Swift Developer chegar aqui,
converter de NSString / String para NSData
var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Objetivo-C:
NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Rápido:
let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String
Primeiro, você deve usar em dataUsingEncoding:
vez de passar UTF8String
. Você só usa UTF8String
quando precisa de uma C
sequência nessa codificação.
Então, UTF-16
basta passar em NSUnicodeStringEncoding
vez de NSUTF8StringEncoding
na sua dataUsingEncoding:
mensagem.
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
str
contém pontos de código maiores que 127. Isso ocorre porque str.length
fornece o número de caracteres Unicode, não o número de bytes. Por exemplo, se str
estiver @"にほんご"
, str.length
fornece 4 enquanto str.UTF8String
na verdade contém 12 bytes. Mesmo se você substituir str.length
por strlen(str.UTF8String)
, ainda estará errado no caso em que str
contenha o caractere NULL, como @"にほ\0んご"
.
Objetivo-C:
NSString para NSData:
NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSData para NSString:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
Rápido:
String para dados:
var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)
Dados para String:
var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Objetivo-C
NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
Rápido
let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)