Ответ 1
амперсанд будет% 26 для HEX в Стандарты кодирования URL
Я хотел бы сделать 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¶m=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 &
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];
амперсанд будет% 26 для HEX в Стандарты кодирования URL
Я использовал -[NSString gtm_stringByEscapingForURLArgument]
, который представлен в Google Toolbox для Mac, в частности, в GTMNSString + URLArguments.h и GTMNSString + URLArguments.m.
Вы можете использовать шестнадцатеричное представление символа, в этом случае% 26.
вы можете просто использовать 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));
Вы используете stringByAddingPercentEscapesUsingEncoding
, точно так же, как и вы.
Проблема в том, что вы недостаточно используете ее. Формат, в который вы вставляете закодированное тело, также имеет амперсанд, который вы не закодировали. Вместо этого нанесите на него незашифрованную строку и закодируйте их (используя stringByAddingPercentEscapesUsingEncoding
) вместе.
<a href='http://somewhere.com/two.woa/wa?id=000&param=0'>click me</a>
Is correct, although ‘&' is more commonly used than ‘&' or ‘,'.
Если метод 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-почту; очень немногие сделают это.
Пример использования% 26 вместо этих атрибутов и без них появился в PHP как массив!
var urlb='/tools/lister.php?type=101%26ID='+ID; // %26 instead of &
window.location.href=urlb;