如何编码“&”在HTML属性值的URL中?

时间:2009-04-08 13:48:15

标签: iphone objective-c cocoa cocoa-touch

我想在电子邮件应用中点击一下网址。问题是参数化的URL因“&”而破坏了这一点。在URL中。下面的body变量是问题行。两种版本的“身体”都是不正确的。电子邮件应用程序打开后,文本将停在“... link:”处。对&符号进行编码需要什么?

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&param=0'>click me</a>"; //original
NSString *body = @"This is a link: <a href='http://somewhere.com/two.woa/wa?id=000&#38;param=0'>click me</a>"; //have also tried &amp;
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];

7 个答案:

答案 0 :(得分:19)

URL Encoding标准

中,十六进制对于HEX将是%26

答案 1 :(得分:11)

我一直在使用-[NSString gtm_stringByEscapingForURLArgument]中提供的{{1}},特别是Google Toolbox for MacGTMNSString+URLArguments.h

答案 2 :(得分:3)

您可以使用该字符的十六进制表示,在本例中为%26。

答案 3 :(得分:3)

您只需将CFURLCreateStringByAddingPercentEscapesCFBridgingRelease一起用于 ARC 支持

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));

答案 4 :(得分:1)

您使用stringByAddingPercentEscapesUsingEncoding,就像您正在做的那样。

问题是你没有充分利用它。您插入编码主体的格式还有一个&符号,您尚未对其进行编码。将未编码的字符串转换为它,并将它们编码(使用stringByAddingPercentEscapesUsingEncoding)。

答案 5 :(得分:0)

<a href='http://somewhere.com/two.woa/wa?id=000&#38;param=0'>click me</a>

是正确的,虽然'&amp; amp;'比'&amp;#38;'或'&amp;#x2C;'更常用。

如果'stringByAddingPercentEscapesUsingEncoding'方法执行它在锡上的说法,它应该工作(*),但NSString文档看起来有点不清楚哪些字符完全被转义。检查你最终会得到什么,URL应该是这样的:

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

(*:模块化通常的免责声明:mailto:链接参数如'subject'和'body'是非标准的,在许多情况下都会失败,通常应该避免。)

  

电子邮件应用程序打开后,文本将停在“... link:”。

如果'stringByAddingPercentEscapesUsingEncoding'没有将'&lt;'转义为'%3C',那可能就是问题所在。否则,它可能与逃避无关,而是故意禁止使用'&lt;'的邮件程序限制。如前所述,?body = ...不是一个可靠的功能。

在任何情况下,您都不应期望邮件程序识别HTML并尝试发送HTML邮件;很少有人会这样做。

答案 6 :(得分:0)

使用%26而不是&amp;的示例没有这个属性作为数组到达PHP!

    var urlb='/tools/lister.php?type=101%26ID='+ID; // %26 instead of &
    window.location.href=urlb;