Comment encoder «&» dans une URL dans une valeur d'attribut HTML?
-
06-09-2019 - |
Question
Je voudrais faire un clic URL dans l'application de messagerie. Le problème est qu'une URL paramétrée casse cela à cause de "&" dans l'URL. La variable corporelle ci-dessous est la ligne de problème. Les deux versions du «corps» sont incorrectes. Une fois l'application e-mail ouverte, le texte s'arrête à "... lien:". Qu'est-ce qui est nécessaire pour coder l'ampère et?
NSString *subject = @"This is a test";
NSString *encodedSubject =
[subject stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//NSString *body = @"This is a link: <a href='http://somewhere.com/two.woa/wa?id=000¶m=0'>click me</a>"; //original
NSString *body = @"This is a link: <a href='http://somewhere.com/two.woa/wa?id=000&param=0'>click me</a>"; //have also tried &
NSString *encodedBody =
[body stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *formattedURL = [NSString stringWithFormat: @"mailto:myname@somedomain.com?subject=%@&body=%@", encodedSubject, encodedBody];
NSURL *url = [[NSURL alloc] initWithString:formattedURL];
[[UIApplication sharedApplication] openURL:url];
La solution
L'Ampersand serait% 26 pour Hex in Encodage d'URL normes
Autres conseils
J'ai utilisé -[NSString gtm_stringByEscapingForURLArgument]
, qui est fourni dans Google Toolbox pour Mac, spécifiquement dans Gtmnsstring + urlarguments.h et Gtmnsstring + urlarguments.m.
Vous pouvez utiliser une représentation hexadécimale du personnage, dans ce cas% 26.
vous pouvez simplement utiliser CFURLCreateStringByAddingPercentEscapes
avec CFBridgingRelease
pour ARC Support
NSString *subject = @"This is a test";
// Encode all the reserved characters, per RFC 3986
// (<http://www.ietf.org/rfc/rfc3986.txt>)
NSString *encodedSubject =
(NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)subject,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
Tu utilises stringByAddingPercentEscapesUsingEncoding
, exactement comme vous le faites.
Le problème est que vous ne l'utilisez pas assez. Le format dans lequel vous insérez le corps codé aussi A un ampère et que vous n'avez pas codé. Ajouter la chaîne non codée dessus à la place et les encoder (en utilisant stringByAddingPercentEscapesUsingEncoding
) ensemble.
<a href='http://somewhere.com/two.woa/wa?id=000&param=0'>click me</a>
Est correct, bien que '&' soit plus couramment utilisé que '&' ou ','.
Si la méthode 'StringByAddingPerceScapesusUSINCODing' fait ce qu'elle dit sur l'étain, elle devrait fonctionner (*), mais la documentation NSString semble un peu claire sur les caractères exactement échappés. Vérifiez ce que vous vous retrouvez, l'URL devrait être quelque chose comme:
mailto:bob@example.com?subject=test&body=Link%3A%3Ca%20href%3D%22http%3A//example.com/script%3Fp1%3Da%26amp%3Bp2%3Db%22%3Elink%3C/a%3E
(*: modulo l'avertissement habituel que les paramètres de liaison comme «sujet» et «corps» sont non standard, échoueront dans de nombreuses situations et devraient généralement être évités.)
Une fois l'application e-mail ouverte, le texte s'arrête à "... lien:".
Si «StringByAddingPerceScapesususingEncoding» n'échappe pas «<» à «% 3c», cela pourrait être le problème. Sinon, ce n'est peut-être pas à voir avec les évasions, mais une restriction délibérée au niveau du mailer pour interdire '<'. Comme mentionné précédemment,? Body = ... n'est pas une fonctionnalité fiable.
Dans tous les cas, vous ne devez pas vous attendre à ce que le Mailer reconnaisse le HTML et essaie d'envoyer un courrier HTML; Très peu le feront.
Exemple d'utilisation de% 26 au lieu de & sans ces attributs est arrivé en php comme tableau!
var urlb='/tools/lister.php?type=101%26ID='+ID; // %26 instead of &
window.location.href=urlb;