Réponses:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString
utilise UTF-16 en interne, il peut donc y avoir un léger gain de performances car il n'a pas à faire de conversion UTF-16 <-> UTF-8. Personnellement, nous préférons (comme le suggère @ gnasher729) la robustesse aux performances et utilisons UTF-8 partout.
Faire:
NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
alors n'hésitez pas à continuer NSJSONSerialization:JSONObjectWithData
.
Suite aux commentaires, à la documentation officielle et aux vérifications , cette réponse a été mise à jour concernant la suppression d'un prétendu terminateur NULL:
Comme documenté par dataUsingEncoding ::
Valeur de retour
Le résultat de l'invocation
dataUsingEncoding:allowLossyConversion:
de NO comme deuxième argument
Tel que documenté par getCString: maxLength: encoding: et cStringUsingEncoding ::
notez que les données retournées par
dataUsingEncoding:allowLossyConversion:
ne sont pas une chaîne C stricte car elles n'ont pas de terminateur NULL
dataUsingEncoding:
ne renvoie pas de données terminées par null. Seules les UTF8String
autres méthodes qui renvoient une chaîne C renvoient une chaîne terminée par null.
(note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator)
. J'ai dû manquer ça plus tôt. Je serai sûr d'écrire quoi que ce soit à l'avenir, cependant.
cStringUsingEncoding:
. Je regardais en dessous dataUsingEncoding:
.)
Si Swift Developer vient ici,
pour convertir de NSString / String en NSData
var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Objectif c:
NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Rapide:
let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String
Tout d'abord, vous devez utiliser dataUsingEncoding:
au lieu de passer par UTF8String
. Vous utilisez uniquement UTF8String
lorsque vous avez besoin d'une C
chaîne dans cet encodage.
Ensuite, pour UTF-16
, passez simplement NSUnicodeStringEncoding
au lieu de NSUTF8StringEncoding
dans votre dataUsingEncoding:
message.
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
str
contient des points de code supérieurs à 127. Cela est dû au fait qu'il str.length
donne le nombre de caractères Unicode, pas le nombre d'octets. Par exemple, si str
est @"にほんご"
, str.length
donne 4 alors str.UTF8String
qu'il contient en fait 12 octets. Même si vous remplacez str.length
par strlen(str.UTF8String)
, il sera toujours incorrect pour le cas où str
contient le caractère NULL, tel que @"にほ\0んご"
.
Objectif c:
NSString à NSData:
NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSData à NSString:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
Rapide:
Chaîne en données:
var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)
Données à chaîne:
var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Objectif c
NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
Rapide
let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)