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

Я хотел бы сделать URL-адрес, доступный в приложении электронной почты. Проблема в том, что параметризованный URL-адрес нарушает это из-за "&" в URL. Ниже приведена переменная тела. Обе версии "тела" неверны. Когда приложение электронной почты откроется, текст остановится на "... 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:[email protected]?subject=%@&body=%@", encodedSubject, encodedBody];
NSURL *url = [[NSURL alloc] initWithString:formattedURL];
[[UIApplication sharedApplication] openURL:url];

Ответы

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Is correct, although ‘&amp;' is more commonly used than ‘&#38;' or ‘&#x2C;'.

Если метод stringByAddingPercentEscapesUsingEncoding делает то, что он говорит в олове, он должен работать (*), но документация NSString выглядит немного неясной, на каких символах точно экранируются. Проверьте, что вы в конечном итоге, URL-адрес должен выглядеть примерно так:

mailto:[email protected]?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, такие как "субъект" и "тело" нестандартны, во многих ситуациях не удастся, и их обычно следует избегать.)

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

Если 'stringByAddingPercentEscapesUsingEncoding не экранируется' < до '% 3C, это может быть проблемой. В противном случае это может быть не что-то связанное с экранами, а преднамеренное ограничение на уровне почтовой рассылки, чтобы запретить '<. Как уже упоминалось ранее, body =... не является надежной функцией.

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

Ответ 7

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

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