J'ai encodé UTF-8 à NSData
partir du serveur Windows et je souhaite le convertir en NSString
iPhone. Étant donné que les données contiennent des caractères (comme un symbole de degré) qui ont des valeurs différentes sur les deux plates-formes, comment convertir des données en chaîne?
567
Réponses:
Si les données ne se terminent pas par un caractère nul, vous devez utiliser
-initWithData:encoding:
Si les données se terminent par un caractère nul, vous devez plutôt utiliser
-stringWithUTF8String:
pour éviter le supplément\0
à la fin.(Notez que si l'entrée n'est pas correctement encodée en UTF-8, vous obtiendrez
nil
.)Variante rapide:
Si les données se terminent par null, vous pouvez utiliser la méthode sûre qui consiste à supprimer le caractère nul ou la méthode non sécurisée similaire à la version Objective-C ci-dessus.
la source
Vous pourriez appeler cette méthode
la source
NSData
sait combien d'octets il a ...NSData
à uneNSString
(voir la réponse de KennyTM), je suis surpris qu'il n'y en ait pas+(id)stringWithUTF8Data:(NSData *)data
qui fonctionne.Je soumets humblement une catégorie pour rendre cela moins ennuyeux:
et
(Notez que si vous n'utilisez pas ARC, vous en aurez besoin
autorelease
.)Maintenant, au lieu de ce qui est terriblement verbeux:
Tu peux faire:
la source
La version Swift de String en Data et de retour en String:
Xcode 10.1 • Swift 4.2.1
Terrain de jeux
la source
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 cela semble fonctionner:
Objectif c
Rapide
la source
[[NSData alloc] initWithBase64EncodedString:signatureString options:0]
; Swift :NSData(base64EncodedString: str options: nil)
Juste pour résumer, voici une réponse complète, qui a fonctionné pour moi.
Mon problème était que lorsque j'utilisais
La chaîne que j'ai obtenue était imprévisible: autour de 70%, elle contenait la valeur attendue, mais trop souvent elle a résulté avec
Null
ou pire encore: endommagée à la fin de la chaîne.Après avoir creusé, je suis passé à
Et a obtenu le résultat attendu à chaque fois.
la source
Avec Swift 5, vous pouvez utiliser
String
l'init(data:encoding:)
initialiseur de pour convertir uneData
instance en uneString
instance utilisant UTF-8.init(data:encoding:)
a la déclaration suivante:Le code Playground suivant montre comment l'utiliser:
la source