답변:
당신이 원하는 캐릭터를 탈출하는 것은 조금 더 일입니다.
예제 코드
iOS7 이상 :
NSString *unescaped = @"http://www";
NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
NSLog(@"escapedString: %@", escapedString);
NSLog 출력 :
escapedString : http % 3A % 2F % 2Fwww
다음은 유용한 URL 인코딩 문자 세트입니다.
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
위의 모든 것을 결합한 문자 집합 만들기 :
NSCharacterSet *URLCombinedCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@" \"#%/:<>?@[\\]^`{|}"] invertedSet];
Base64 만들기
Base64 문자 집합의 경우 :
NSCharacterSet *URLBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"/+=\n"] invertedSet];
스위프트 3.0 :
var escapedString = originalString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)
스위프트 2.x의 경우 :
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
참고 : stringByAddingPercentEncodingWithAllowedCharacters
인코딩이 필요한 UTF-8 문자도 인코딩합니다.
iOS7 이전 버전에서는
ARC와 함께 Core Foundation을 사용하여 Core Foundation 사용 :
NSString *escapedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef) unescaped,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]\" "),
kCFStringEncodingUTF8));
ARC없이 핵심 기반 사용 :
NSString *escapedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)unescaped,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]\" "),
kCFStringEncodingUTF8);
참고 : -stringByAddingPercentEscapesUsingEncoding
올바른 인코딩을 생성하지 않습니다 . 이 경우 동일한 문자열을 반환하는 것은 인코딩되지 않습니다.
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding
14 개의 문자를 인코딩합니다 :
`# % ^ {} [] | \ "<> 및 이스케이프 된 공백 문자.
testString :
" `~!@#$%^&*()_+-={}[]|\\:;\"'<,>.?/AZaz"
encodeString :
"%20%60~!@%23$%25%5E&*()_+-=%7B%7D%5B%5D%7C%5C:;%22'%3C,%3E.?/AZaz"
참고 : 필요에 따라 변경하지 않으면이 문자 세트가 사용자의 요구를 충족시키는 지 고려하십시오.
인코딩이 필요한 RFC 3986 문자 (인코딩 접두사 문자이므로 %가 추가됨) :
"! # $ & '() * +, / :; =? @ [] %"
일부 "예약되지 않은 문자"는 추가로 인코딩됩니다.
"\ n \ r \"%-. <> \ ^ _`{|} ~ "
-stringByAddingPercentEscapesUsingEncoding
방법을 사용할 수 있습니다 .
stringByAddingPercentEscapesUsingEncoding
행동을 기억합니다 . '&'및 '='또는 이와 유사한 말만 인코딩합니다.
NSString
with로 필요한 문자 세트를 characterSetWithCharactersInString
만들고 inverse를 invertedSet
사용하여로 사용하십시오 stringByAddingPercentEncodingWithAllowedCharacters
. 예를 들어이 SO 답변을 참조하십시오 .
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
CFStringConvertNSStringEncodingToEncoding(encoding));
}
CFURLCreateStringByAddingPercentEscapes()
더 이상 사용되지 않습니다. [NSString stringByAddingPercentEncodingWithAllowedCharacters:]
대신 사용하십시오 .
이것은 내 해결책이 아닙니다. 다른 사람이 stackoverflow로 작성했지만 방법을 잊어 버렸습니다.
어떻게 든이 솔루션은 "잘 작동"합니다. 분음 부호, 한자 등을 처리합니다.
- (NSString *) URLEncodedString {
NSMutableString * output = [NSMutableString string];
const char * source = [self UTF8String];
int sourceLen = strlen(source);
for (int i = 0; i < sourceLen; ++i) {
const unsigned char thisChar = (const unsigned char)source[i];
if (false && thisChar == ' '){
[output appendString:@"+"];
} else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
(thisChar >= 'a' && thisChar <= 'z') ||
(thisChar >= 'A' && thisChar <= 'Z') ||
(thisChar >= '0' && thisChar <= '9')) {
[output appendFormat:@"%c", thisChar];
} else {
[output appendFormat:@"%%%02X", thisChar];
}
}
return output;
}
누군가이 코드를 작성한 사람을 말하면 정말 감사하겠습니다. 기본적으로 그는이 인코딩 된 문자열이 원하는대로 정확하게 해독되는 이유에 대해 설명합니다.
나는 그의 해결책을 조금 수정했다. 공간이 +가 아닌 % 20으로 표시되는 것을 좋아합니다. 그게 다야.
NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NUL,(CFStringRef)@"parameter",NULL,(CFStringRef)@"!*'();@&+$,/?%#[]~=_-.:",kCFStringEncodingUTF8 );
NSURL * url = [[NSURL alloc] initWithString:[@"address here" stringByAppendingFormat:@"?cid=%@",encodedString, nil]];
이것은 Objective C ARC에서 작동 할 수 있습니다. CFBridgingRelease를 사용하여 Core Foundation 스타일 객체를 Objective-C 객체로 캐스팅하고 객체의 소유권을 ARC로 이전 하십시오. 여기에서 CFBridgingRelease 함수를 참조 하십시오.
+ (NSString *)encodeUrlString:(NSString *)string {
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes
(kCFAllocatorDefault,
(__bridge CFStringRef)string,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]"),
kCFStringEncodingUTF8)
);}
여기 내가 사용하는 것이 있습니다. 이 @autoreleasepool
기능 을 사용해야합니다. 그렇지 않으면 프로그램이 충돌하거나 IDE를 잠글 수 있습니다. 수정 사항을 알 때까지 IDE를 세 번 다시 시작해야했습니다. 이 코드는 ARC를 준수하는 것으로 보입니다.
이 질문은 여러 번 요청되어 왔으며 많은 답변이 주어졌지만 슬프게도 선택된 모든 질문 (그리고 다른 사람들이 제안한 것)은 모두 잘못되었습니다.
내가 사용한 테스트 문자열은 다음과 같습니다. This is my 123+ test & test2. Got it?!
이들은 Objective C ++ 클래스 메소드입니다.
static NSString * urlDecode(NSString *stringToDecode) {
NSString *result = [stringToDecode stringByReplacingOccurrencesOfString:@"+" withString:@" "];
result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return result;
}
static NSString * urlEncode(NSString *stringToEncode) {
@autoreleasepool {
NSString *result = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)stringToEncode,
NULL,
(CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
kCFStringEncodingUTF8
));
result = [result stringByReplacingOccurrencesOfString:@"%20" withString:@"+"];
return result;
}
}
Google 은 Mac 용 Google 도구 상자 에서이를 구현합니다 . 그래서 그들이하는 일을 최고조로하기 좋은 곳입니다. 또 다른 옵션은 도구 상자를 포함하고 해당 도구를 구현하는 것입니다.
이것이 내가 신속하게하는 일입니다.
extension String {
func encodeURIComponent() -> String {
return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
}
func decodeURIComponent() -> String {
return self.componentsSeparatedByString("+").joinWithSeparator(" ").stringByRemovingPercentEncoding!
}
}
// 다음과 같이 NSString 인스턴스 메소드를 사용하십시오.
+ (NSString *)encodeURIComponent:(NSString *)string
{
NSString *s = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}
+ (NSString *)decodeURIComponent:(NSString *)string
{
NSString *s = [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}
요청한 모든 URL이 아니라 매개 변수 값에 대해서만 인코딩 또는 디코딩해야합니다.
int strLength = 0;
NSString *urlStr = @"http://www";
NSLog(@" urlStr : %@", urlStr );
NSMutableString *mutableUrlStr = [urlStr mutableCopy];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
strLength = [mutableUrlStr length];
[mutableUrlStr replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:NSMakeRange(0, strLength)];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
strLength = [mutableUrlStr length];
[mutableUrlStr replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:NSMakeRange(0, strLength)];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
ùÕ9y^VêÏÊEØ®.ú/V÷ÅÖêú2Èh~
이 있습니다. 아래 해결책 중 어느 것도 이것을 해결하지 못하는 것 같습니다!