【问题标题】:How do I encode "&" in a URL in an HTML attribute value?如何在 HTML 属性值的 URL 中编码“&”?
【发布时间】:2015-11-21 01:09:50
【问题描述】:

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

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

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    URL Encoding 标准中 HEX 的 & 符号为 %26

    【讨论】:

      【解决方案2】:

      我一直在使用-[NSString gtm_stringByEscapingForURLArgument],它在Google Toolbox for Mac 中提供,特别是在GTMNSString+URLArguments.hGTMNSString+URLArguments.m 中。

      【讨论】:

      • 仅供参考,您需要以下四个文件才能使其工作:GTMDefines.h GTMGarbageCollection.h GTMNSString+URLArguments.h GTMNSString+URLArguments.m
      • 如果您将返回更改为return [(NSString *)escaped autorelease];,则很容易编写一个不使用他们的垃圾收集的版本。
      • @keegan3d 如果您使用的是 ARC ,则可以将 return 更改为 return (__bridge NSString *)escaped;
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您可以简单地使用 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));
        

        【讨论】:

          【解决方案5】:

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

          问题是你没有足够地使用它。您插入编码正文的格式有一个与号,您没有编码。将未编码的字符串附加到它上面,然后将它们一起编码(使用stringByAddingPercentEscapesUsingEncoding)。

          【讨论】:

          • 不太清楚你的意思。
          • 您传递给 stringWithFormat: 的格式字符串中有一个未编码的 & 符号。 stringWithFormat: 不会对其进行转义,并且您现有的 stringByAddingPercentEscapes 消息将无法对其进行反向处理。
          • 我会重新排列代码,以便您将 stringByAddingPercentEscapes 发送到您从 stringWithFormat: 获得的字符串。另一种方法是以格式字符串文字对其进行转义。
          【解决方案6】:
          <a href='http://somewhere.com/two.woa/wa?id=000&#38;param=0'>click me</a>
          

          是正确的,虽然“&”比“&”或“,”更常用。

          如果“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: 链接参数,如“主题”和“正文”是非标准的,在许多情况下会失败,通常应该避免。)

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

          如果“stringByAddingPercentEscapesUsingEncoding”没有将“

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

          【讨论】:

          • 这被标记为一个 iPhone 问题,HTML 邮件在 iPhone 邮件中运行良好。
          • 是的 - HTML 邮件工作正常。我用它所有的时间。问题出在 URL 参数中。
          【解决方案7】:

          使用 %26 代替 & 的示例没有此属性以数组形式出现在 PHP 中!

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

          【讨论】:

            猜你喜欢
            • 2012-04-28
            • 2011-12-03
            • 2017-03-14
            • 2012-07-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多