Вопрос

Я хотел бы сделать 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&#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];
Это было полезно?

Решение

Ampersand будет %26 для Hex в URL -кодирование стандарты

Другие советы

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

You can use a hex representation of the character, in this case %26.

you can simply use CFURLCreateStringByAddingPercentEscapes with CFBridgingRelease for 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));

You use stringByAddingPercentEscapesUsingEncoding, exactly like you are doing.

The problem is that you aren't using it enough. The format into which you're inserting the encoded body also has an ampersand, which you have not encoded. Tack the unencoded string onto it instead, and encode them (using stringByAddingPercentEscapesUsingEncoding) together.

<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;’.

If the ‘stringByAddingPercentEscapesUsingEncoding’ method does what it says on the tin, it should work(*), but the NSString documentation looks a bit unclear on which characters exactly are escaped. Check what you are ending up with, the URL should be something like:

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

(*: modulo the usual disclaimer that mailto: link parameters like ‘subject’ and ‘body’ are non-standard, will fail in many situations, and should generally be avoided.)

Once the email app opens, text stops at "...link:".

If ‘stringByAddingPercentEscapesUsingEncoding’ is not escaping ‘<’ to ‘%3C’, that could be the problem. Otherwise, it might not be anything to do with escapes, but a deliberate mailer-level restriction to disallow ‘<’. As previously mentioned, ?body=... is not a reliable feature.

In any case, you shouldn't expect the mailer to recognise the HTML and try to send an HTML mail; very few will do that.

Example of use of %26 instead of & without this attributes arrived in PHP as an array!

    var urlb='/tools/lister.php?type=101%26ID='+ID; // %26 instead of &
    window.location.href=urlb;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top