Como faço para codificar "&" em um URL em um valor de atributo HTML?
-
06-09-2019 - |
Pergunta
Eu gostaria de criar um URL Click ABLE no aplicativo de email. O problema é que um URL parametrizado quebra isso por causa de "&" no URL. A variável do corpo abaixo é a linha do problema. Ambas as versões do "corpo" estão incorretas. Depois que o aplicativo de email é aberto, o texto para em "... link:". O que é necessário para codificar os amperes e?
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:myname@somedomain.com?subject=%@&body=%@", encodedSubject, encodedBody];
NSURL *url = [[NSURL alloc] initWithString:formattedURL];
[[UIApplication sharedApplication] openURL:url];
Solução
o ampersa e seria %26 para hexadecimal Codificação de URL padrões
Outras dicas
Eu tenho usado -[NSString gtm_stringByEscapingForURLArgument]
, que é fornecido em Caixa de ferramentas do Google para Mac, especificamente em GtmnsString+urlarguds.h e GtmnsString+urlarguds.m.
Você pode usar uma representação hexadecimal do personagem, neste caso %26.
você pode simplesmente usar CFURLCreateStringByAddingPercentEscapes
com CFBridgingRelease
por ARCO Apoio, suporte
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));
Você usa stringByAddingPercentEscapesUsingEncoding
, exatamente como você está fazendo.
O problema é que você não está usando o suficiente. O formato em que você está inserindo o corpo codificado também tem um ampersa e, que você não codificou. Em vez disso, coloque a corda não codificada e codificá -los (usando stringByAddingPercentEscapesUsingEncoding
) juntos.
<a href='http://somewhere.com/two.woa/wa?id=000&param=0'>click me</a>
Está correto, embora '&' seja mais comumente usado que '&' ou ','.
Se o método 'StringByaddingPercentesCapesusingEncoding' fizer o que diz na lata, ele deve funcionar (*), mas a documentação da NSString parece um pouco clara sobre quais caracteres exatamente são escapados. Verifique o que você está acabando, o URL deve ser algo como:
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 A isenção de isenção usual que o Mailto: parâmetros de link como 'sujeito' e 'corpo' não são padronizados, falhará em muitas situações e geralmente deve ser evitado.)
Depois que o aplicativo de email é aberto, o texto para em "... link:".
Se 'StringByaddingPercenteScapeSusingEncoding' não estiver escape '<' para '%3C', esse pode ser o problema. Caso contrário, pode não ter nada a ver com fugas, mas uma restrição deliberada no nível de mala direta para não permitir '<'. Como mencionado anteriormente, "Body = ... não é um recurso confiável.
De qualquer forma, você não deve esperar que a mala direta reconheça o HTML e tente enviar um Mail HTML; Muito poucos farão isso.
Exemplo de uso de %26 em vez de e sem esses atributos chegaram ao PHP como uma matriz!
var urlb='/tools/lister.php?type=101%26ID='+ID; // %26 instead of &
window.location.href=urlb;