Как мне кодировать «&» в URL-адресе в значении атрибута HTML? - PullRequest
15 голосов
/ 08 апреля 2009

Я бы хотел, чтобы URL-адрес был доступен в приложении электронной почты. Проблема в том, что параметризованный 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 ]

19 голосов
/ 08 апреля 2009

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

11 голосов
/ 08 апреля 2009

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

3 голосов
/ 10 апреля 2013

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

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

1 голос
/ 08 апреля 2009

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

Проблема в том, что вы недостаточно используете его. Формат, в который вы вставляете кодированное тело , также имеет амперсанд, который вы не закодировали. Вместо этого прикрепите на него некодированную строку и закодируйте их (используя stringByAddingPercentEscapesUsingEncoding) вместе.

0 голосов
/ 20 ноября 2015

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

    var urlb='/tools/lister.php?type=101%26ID='+ID; // %26 instead of &
    window.location.href=urlb;
0 голосов
/ 08 апреля 2009
<a href='http://somewhere.com/two.woa/wa?id=000&#38;param=0'>click me</a>

Правильно, хотя ‘& 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: link, такие как «subject» и «body», нестандартны, во многих ситуациях приводят к сбою, и их, как правило, следует избегать.)

После открытия приложения электронной почты текст останавливается на «... link:».

Если «stringByAddingPercentEscapesUsingEncoding» не экранируется от «<» до «% 3C», это может быть проблемой. В противном случае это может быть связано не с побегами, а с преднамеренным ограничением на уровне почтовой программы, запрещающим "<". Как упоминалось ранее,? Body = ... не является надежной функцией. </p>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...