572 votes

Convertir les NSData codées en UTF-8 en NSString

J'ai encodé UTF-8 NSData à partir du serveur Windows et je veux le convertir en NSString pour iPhone. Puisque les données contiennent des caractères (comme le symbole du degré) qui ont des valeurs différentes sur les deux plateformes, comment convertir des données en chaîne de caractères ?

16 votes

UTF-8 est UTF-8 partout. Une fois que c'est UTF-8, il n'y a pas de valeurs différentes pour les différentes plateformes. C'est là tout l'intérêt.

1171voto

KennyTM Points 232647

Si les données ne sont pas à terminaison nulle, vous devez utiliser la fonction -initWithData:encoding:

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

Si les données sont de type null-terminated, vous devez plutôt utiliser -stringWithUTF8String: pour éviter les frais supplémentaires \0 à la fin.

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

(Notez que si l'entrée n'est pas correctement encodée en UTF-8, vous obtiendrez nil .)


Variante rapide :

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

Si les données sont terminées par un caractère nul, vous pouvez utiliser la méthode sûre qui consiste à supprimer le caractère nul, ou la méthode non sûre similaire à la version Objective-C ci-dessus.

// 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:))

5 votes

Attention, si vous utilisez stringWithUTF8String, ne lui passez pas un argument NULL, sinon une exception sera levée.

31 votes

ATTENTION : lorsque vous utilisez "stringWithUTF8String :" sur une chaîne qui n'est pas terminée par un caractère nul, le résultat est imprévisible !

2 votes

Ces deux solutions ne me rapportent rien.

28voto

Gouldsc Points 348

Vous pourriez appeler cette méthode

+(id)stringWithUTF8String:(const char *)bytes.

27 votes

Uniquement si les données sont à terminaison nulle. Ce qui peut ne pas être le cas (et, en fait, ne l'est probablement pas).

0 votes

Je ne vois pas pourquoi cela ne fonctionnerait pas avec des chaînes de caractères non terminées par des zéros, étant donné que la fonction NSData sait combien d'octets il a...

5 votes

@Claudiu, vous ne passez pas un objet NSData, vous lui passez un (const char *) obtenu avec [data bytes], qui est juste un pointeur, sans information de taille. Par conséquent, le bloc de données vers lequel il pointe doit avoir une terminaison nulle. Consultez la documentation, elle le dit explicitement.

21voto

Claudiu Points 58398

Je propose humblement une catégorie pour rendre cela moins ennuyeux :

@interface NSData (EasyUTF8)

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

@end

et

@implementation NSData (EasyUTF8)

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

@end

(Notez que si vous n'utilisez pas l'ARC, vous aurez besoin d'un fichier de type autorelease là.)

Maintenant, au lieu de l'effroyablement verbeux :

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

Vous pouvez le faire :

NSData *data = ...
[data asUTF8String];

16voto

mikeho Points 310

Parfois, les méthodes des autres réponses ne fonctionnent pas. Dans mon cas, je génère une signature avec ma clé privée RSA et le résultat est NSData. J'ai trouvé que ceci semble fonctionner :

Objectif-C

NSData *signature;
NSString *signatureString = [signature base64EncodedStringWithOptions:0];

Swift

let signatureString = signature.base64EncodedStringWithOptions(nil)

0 votes

Comment obtenir cette chaîne de caractères vers nsdata ?

1 votes

@DarshanKunjadiya : Objectif-C : [[NSData alloc] initWithBase64EncodedString:signatureString options:0] ; Swift : NSData(base64EncodedString: str options: nil)

2voto

mahesh chowdary Points 198

Utilisez cette méthode. Il suffit d'ajouter nsdata à initwithdata

NSString *aStr = [[NSString alloc] initWithData:data_reply encoding:NSASCIIStringEncoding];
NSLog(@"aStr:%@",aStr);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X