Question

j'utilise AFRéseau dans mon application iOS.J'ai découvert un problème qui se produit lorsque les paramètres de requête contiennent des signes de pourcentage.Ensuite, l'encodage échoue.La méthode AFURLEncodedStringFromStringWithEncoding renvoie zéro.

J'ai testé ce code et il s'imprime (null):

NSLog(@"%@", AFURLEncodedStringFromStringWithEncoding(@"%", NSUTF8StringEncoding));

Le résultat attendu devrait être : %25.D'autres caractères peuvent être codés sans problème.

La méthode est définie comme suit :

NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
    static NSString * const kAFLegalCharactersToBeEscaped = @"?!@#$^&%*+,:;='\"`<>()[]{}/\\|~ ";

    // Following the suggestion in documentation for `CFURLCreateStringByAddingPercentEscapes` to "pre-process" URL strings (using stringByReplacingPercentEscapesUsingEncoding) with unpredictable sequences that may already contain percent escapes.
    return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)[string stringByReplacingPercentEscapesUsingEncoding:encoding], NULL, (CFStringRef)kAFLegalCharactersToBeEscaped, CFStringConvertNSStringEncodingToEncoding(encoding)) autorelease];
}

Avez-vous une idée de ce qui ne va pas ici ?

MODIFIER: Le problème a été résolu dans AFNetworking.

Était-ce utile?

La solution

Je ne connais pas l'API mais l'encodage des URL est normalement effectué par

  • Codage UTF-8 des parties de chaîne (chemin, arguments, etc.) en octets
  • appliquer un codage en pourcentage des valeurs d'octet pour obtenir des morceaux de chaîne uniquement ASCII
  • assembler les éléments d'URL avec les séparateurs :, /, ?, & etc.
  • encoder à nouveau cette chaîne en octets
  • l'envoyer par fil

Voir http://tools.ietf.org/html/rfc3986#section-2.5 pour les nuances.Notez que la RFC indique que si l'URL fait référence à un document sur un système EBCDIC, l'URL doit spécifier les valeurs en octets pour l'encodage EBCDIC de son nom, et non le nom de chaîne sous lequel les utilisateurs humains du système EBCDIC le connaissent.Ainsi, une URL est en fin de compte une chaîne d'octets et non une chaîne de caractères.

Quant à savoir comment faire en sorte que votre API représente correctement cette chaîne d'octets, je ne suis pas sûr.

Autres conseils

Il suffit de supprimer le stringByReplacingPercentEscapesUsingEncoding:encoding c'est bien, pas besoin d'encoder deux fois, donc la valeur de retour devrait être :

return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                    (CFStringRef)string, 
                    NULL, 
                    (CFStringRef)kAFLegalCharactersToBeEscaped, 
                    CFStringConvertNSStringEncodingToEncoding(encoding)) autorelease];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top