Как закодировать " & " в URL в значении атрибута HTML?


Я хотел бы сделать URL-адрес доступным в приложении электронной почты. Проблема в том, что параметризованный URL-адрес нарушает это из-за "&" в URL-адресе. Переменная тела ниже-это проблемная линия. Обе версии "тела" неверны. Как только приложение электронной почты открывается, текст останавливается на "...ссылка:". Что нужно для кодирования амперсанда?

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&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 14

7 ответов:

Амперсанд будет равен %26 для HEX в кодировке URL стандартах

Я использую -[NSString gtm_stringByEscapingForURLArgument], который предоставляется в Google Toolbox для Mac, в частности в GTMNSString+URLArguments.h и GTMNSString+URLArguments.m .

Можно использовать шестнадцатеричное представление символа, в данном случае %26.

Вы можете просто использовать CFURLCreateStringByAddingPercentEscapes с CFBridgingRelease для 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));

Вы используете stringByAddingPercentEscapesUsingEncoding, точно так же, как вы это делаете.

Проблема в том, что вы недостаточно используете его. Формат, в который вы вставляете закодированное тело также имеет амперсанд, который вы не закодировали. Вместо этого прикрепите к нему незашифрованную строку и Закодируйте их (используя stringByAddingPercentEscapesUsingEncoding) вместе.
<a href='http://somewhere.com/two.woa/wa?id=000&#38;param=0'>click me</a>

Верно, хотя ‘ & "используется чаще, чем" & "или",".

Если метод’ stringByAddingPercentEscapesUsingencoding ' делает то, что он говорит на tin, он должен работать (*), но документация по 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, такие как "subject" и "body", являются нестандартными, во многих случаях потерпит неудачу ситуаций, и, как правило, следует избегать.)

Как только приложение электронной почты открывается, текст останавливается на "...ссылка:".

Если 'stringByAddingPercentEscapesUsingencoding' не экранирует ‘

В любом случае, вы не должны ожидать, что почтовая программа распознает HTML и попробуйте отправить HTML-письмо; очень немногие сделают это.

Пример использования %26 вместо & без этих атрибутов поступил в PHP в виде массива!

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