URL 인코딩이 필요한 이유
API 기반 웹 애플리케이션을 개발할 때는 여러 웹 서비스 및 URL과 상호작용해야 하는 경우가 많습니다. URL에는 특수 문자, 검색어, 쿼리 파라미터 등 다양한 요소가 포함될 수 있으며, 이러한 요소는 호출하려는 서비스에 따라 달라집니다. 특수 문자를 그대로 전송하면 서버가 URL을 잘못 해석할 수 있기 때문에, 생성하는 URL과 실제 요청되는 URL이 일치하도록 퍼센트 인코딩(percent encoding) 처리가 필수적입니다.
Objective-C에서 URL 인코딩 구현하기
첫 번째 방법은 NSString에 카테고리(Category)를 추가해 URL 인코딩 메서드를 직접 구현하는 것입니다. Core Foundation의 CFURLCreateStringByAddingPercentEscapes 함수를 활용하면 됩니다.
#import "NSString+URLEncoding.h"
@implementation NSString (URLEncoding)
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", CFStringConvertNSStringEncodingToEncoding(encoding));
}
@end두 번째 방법은 NSString에서 기본 제공하는 stringByAddingPercentEscapesUsingEncoding: 메서드를 사용하는 것입니다.
NSString *sUrl = @"https://www.myService.com/search.jsp?param= name"; NSString *encod = [sUrl stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
참고: 위 두 API는 iOS 9 이후 공식적으로 deprecated(사용 중단 권고)되었습니다. 최신 프로젝트에서는 Objective-C의 stringByAddingPercentEncodingWithAllowedCharacters: 메서드나 아래의 Swift 방식을 사용하는 것이 좋습니다.
Swift에서 URL 인코딩하기
Swift에서는 addingPercentEncoding(withAllowedCharacters:) 메서드를 사용해 간단히 URL 인코딩을 처리할 수 있습니다.
func getURL(str: String) -> String? {
return str.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
}이 함수는 인코딩된 URL 문자열(옵셔널 타입)을 반환하며, 다음과 같이 사용할 수 있습니다.
var sURL = "https://www.myService.com/search.jsp?param= name" print(getURL(sURL)!)
실행 결과, 공백처럼 허용되지 않는 문자는 퍼센트 인코딩되어 다음과 같이 출력됩니다.
https://www.myService.com/search.jsp?param=%20name
활용 팁
문자열의 용도에 따라 적절한 allowed character set을 선택하는 것이 중요합니다. 호스트(host) 영역에는 .urlHostAllowed, 쿼리(query) 문자열에는 .urlQueryAllowed를 사용하는 것이 적합하며, 이를 통해 불필요한 이중 인코딩을 방지하고 안정적인 네트워크 요청을 보낼 수 있습니다.