Convierta NSData codificado en UTF-8 a NSString

Resuelto Ashwini Shahapurkar asked hace 54 años • 7 respuestas

Tengo codificado UTF-8 NSDatadesde el servidor de Windows y quiero convertirlo NSStringpara iPhone. Dado que los datos contienen caracteres (como un símbolo de grado) que tienen valores diferentes en ambas plataformas, ¿ cómo convierto datos en cadenas?

Ashwini Shahapurkar avatar Jan 01 '70 08:01 Ashwini Shahapurkar
Aceptado

Si los datos no terminan en nulo, debe utilizar-initWithData:encoding:

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

Si los datos terminan en nulo, debería usarlos -stringWithUTF8String:para evitar el extra \0al final.

NSString* newStr = [NSString stringWithUTF8String:[theData bytes]];

(Tenga en cuenta que si la entrada no está codificada correctamente en UTF-8, obtendrá nil.)


Variante rápida:

let newStr = String(data: data, encoding: .utf8)
// note that `newStr` is a `String?`, not a `String`.

Si los datos terminan en nulo, puede optar por la forma segura, que es eliminar ese carácter nulo, o por la forma insegura similar a la versión de Objective-C anterior.

// safe way, provided data is \0-terminated
let newStr1 = String(data: data.subdata(in: 0 ..< data.count - 1), encoding: .utf8)
// unsafe way, provided data is \0-terminated
let newStr2 = data.withUnsafeBytes(String.init(utf8String:))
kennytm avatar Mar 18 '2010 06:03 kennytm

Podrías llamar a este método.

+(id)stringWithUTF8String:(const char *)bytes.
Gouldsc avatar Mar 18 '2010 06:03 Gouldsc

Humildemente envío una categoría para que esto sea menos molesto:

@interface NSData (EasyUTF8)

// Safely decode the bytes into a UTF8 string
- (NSString *)asUTF8String;

@end

y

@implementation NSData (EasyUTF8)

- (NSString *)asUTF8String {
    return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];    
}

@end

(Tenga en cuenta que si no está utilizando ARC, necesitará un autoreleaseallí).

Ahora, en lugar de lo terriblemente detallado:

NSData *data = ...
[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

Tu puedes hacer:

NSData *data = ...
[data asUTF8String];
Claudiu avatar Oct 01 '2013 23:10 Claudiu