Respuestas:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString
usa UTF-16 internamente, por lo que puede haber una ligera ganancia de rendimiento porque no tiene que hacer una conversión UTF-16 <-> UTF-8. Personalmente, preferimos (como sugiere @ gnasher729) robustez sobre el rendimiento y usamos UTF-8 en todas partes.
Hacer:
NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
entonces siéntase libre de proceder NSJSONSerialization:JSONObjectWithData
.
Después de los comentarios, la documentación oficial y las verificaciones , esta respuesta se actualizó con respecto a la eliminación de un supuesto terminador NULL:
Según lo documentado por dataUsingEncoding ::
Valor de retorno
El resultado de invocar
dataUsingEncoding:allowLossyConversion:
con NO como segundo argumento
Según lo documentado por getCString: maxLength: encoding: y cStringUsingEncoding ::
tenga en cuenta que los datos devueltos por
dataUsingEncoding:allowLossyConversion:
no son una cadena C estricta ya que no tienen un terminador NULL
dataUsingEncoding:
no devuelve datos terminados en nulo. Solo UTF8String
y otros métodos que devuelven una cadena C devuelven una cadena terminada en nulo.
(note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator)
. Debo haberme perdido esto antes. Sin embargo, me aseguraré de escribir cualquier cosa en el futuro.
cStringUsingEncoding:
. Estaba mirando debajo dataUsingEncoding:
.)
En caso de que Swift Developer venga aquí,
para convertir de NSString / String a NSData
var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
C objetivo:
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
En primer lugar, debe usar en dataUsingEncoding:
lugar de pasar UTF8String
. Solo se usa UTF8String
cuando necesita una C
cadena en esa codificación.
Luego, para UTF-16
, simplemente pasa en NSUnicodeStringEncoding
lugar de NSUTF8StringEncoding
en tu dataUsingEncoding:
mensaje.
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
str
contiene puntos de código mayores que 127. Esto se debe a que str.length
proporciona la cantidad de caracteres Unicode, no la cantidad de bytes. Por ejemplo, si str
es así @"にほんご"
, str.length
da 4 mientras que en str.UTF8String
realidad contiene 12 bytes. Incluso si reemplaza str.length
por strlen(str.UTF8String)
, seguirá siendo incorrecto para el caso donde str
contiene el carácter NULL, como @"にほ\0んご"
.
C objetivo:
NSString a NSData:
NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSData a NSString:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
Rápido:
Cadena de datos:
var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)
Datos a la cadena:
var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
C objetivo
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)