HTML 속성 값의 URL에서 "&"를 인코딩하는 방법은 무엇입니까?
-
06-09-2019 - |
문제
전자 메일 앱에서 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¶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];
해결책
암페어는 16 진수의 경우 %26입니다 URL 인코딩 표준
다른 팁
나는 사용하고있다 -[NSString gtm_stringByEscapingForURLArgument]
, 이에 제공됩니다 Mac 용 Google 도구 상자, 특히 gtmnsstring+urlarguments.h 그리고 gtmnsstring+urlarguments.m.
문자의 16 진수 표현,이 경우 %26을 사용할 수 있습니다.
간단히 사용할 수 있습니다 CFURLCreateStringByAddingPercentEscapes
~와 함께 CFBridgingRelease
~을 위한 호 지원하다
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>
'&'는 '&'또는 ','보다 더 일반적으로 사용되지만 맞습니다.
'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
(*: Modulo Mailto : 'Subject'및 'Body'와 같은 링크 매개 변수는 비표준이 아니며 많은 상황에서 실패하며 일반적으로 피해야합니다.)
이메일 앱이 열리면 텍스트가 "... 링크 :"에서 중지됩니다.
'stringByAddingPerCentescapesUsingEncoding'이 '<'로 '%3c'를 벗어나지 않는다면 문제가 될 수 있습니다. 그렇지 않으면 탈출과 관련이 없을 수도 있지만 ''< '를 허용하지 않는 고의적 인 메일러 수준의 제한이 될 수 있습니다. 앞서 언급했듯이, body = ...은 신뢰할 수있는 기능이 아닙니다.
어쨌든 메일러가 HTML을 인식하고 HTML 메일을 보내려고하지 않아야합니다. 그렇게 할 수있는 사람은 거의 없습니다.
이 속성이없는 대신 %26의 사용 예는 배열로 PHP에 도착했습니다!
var urlb='/tools/lister.php?type=101%26ID='+ID; // %26 instead of &
window.location.href=urlb;