Khi phát triển ứng dụng dựa trên API web, chắc chắn chúng ta cần tương tác với nhiều dịch vụ web và URL. URL có thể chứa ký tự đặc biệt, từ khóa tìm kiếm, query, header và nhiều thứ khác tùy thuộc vào dịch vụ. Do đó, chúng ta cần mã hóa (encoding) để URL tạo ra và URL được gọi là giống nhau.
Trong Objective-C
Cách 1: Sử dụng Category NSString+URLEncoding
#import "NSString+URLEncoding.h"
@implementation NSString (URLEncoding)
- (NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self, NULL,
(CFStringRef)@"!*'\"();:@&=+$,/?%#[]%",
CFStringConvertNSStringEncodingToEncoding(encoding));
}
@end
Cách 2: Sử dụng phương thức built-in (deprecated từ iOS 9)
NSString *sUrl = @"https://www.myService.com/search.jsp?param= name";
NSString *encod = [sUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
Trong Swift (Khuyến khích)
Swift cung cấp phương thức hiện đại và an toàn hơn:
func getURL(str: String) -> String? {
return str.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
}
Sử dụng:
var sURL = "https://www.myService.com/search.jsp?param= name"
print(getURL(sURL) ?? "")
// Kết quả: https://www.myService.com/search.jsp?param=%20name
Các CharacterSet phổ biến
.urlQueryAllowed: Cho query parameters (khuyên dùng cho GET params).urlHostAllowed: Cho host/domain.urlPathAllowed: Cho path.urlFragmentAllowed: Cho fragment.alphanumerics: Chỉ chữ và số
Lưu ý: stringByAddingPercentEscapesUsingEncoding đã deprecated. Luôn sử dụng addingPercentEncoding(withAllowedCharacters:) trong Swift mới.