Réponses:
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSStringutilise 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 UTF8Stringautres 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 UTF8Stringlorsque vous avez besoin d'une Cchaîne dans cet encodage.
Ensuite, pour UTF-16, passez simplement NSUnicodeStringEncodingau lieu de NSUTF8StringEncodingdans votre dataUsingEncoding:message.
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
strcontient des points de code supérieurs à 127. Cela est dû au fait qu'il str.lengthdonne le nombre de caractères Unicode, pas le nombre d'octets. Par exemple, si strest @"にほんご", str.lengthdonne 4 alors str.UTF8Stringqu'il contient en fait 12 octets. Même si vous remplacez str.lengthpar strlen(str.UTF8String), il sera toujours incorrect pour le cas où strcontient 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)