The problem is NSString *unencodedString = [NSString stringWithFormat:@"%c",res]
doesn't do what you think it does. char res
cannot hold a value larger than 128 (256 for unsigned char
).
char res = ((char)(400));
NSString *unencodedString = [NSString stringWithFormat:@"%c",res];
XCTAssertEqualObjects(unencodedString, @"\xc2\x90", @"");
static NSString *escape = @":/?&=;+!@#$()',*[]";
NSString *result = (__bridge_transfer NSString *)
CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef)unencodedString,
NULL,
(__bridge CFStringRef)escape,
kCFStringEncodingUTF8);
XCTAssertEqualObjects(result, @"%C2%90", @"");
Here is an example which works.
NSString *unencodedString = @"Ɛ";
static NSString *escape = @":/?&=;+!@#$()',*[]";
NSString *result = (__bridge_transfer NSString *)
CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef)unencodedString,
NULL,
(__bridge CFStringRef)escape,
kCFStringEncodingUTF8);
XCTAssertEqualObjects(result, @"%C6%90", @"");
UPDATE
If you want a sample like this to work, use unichar
and -stringWithCharacters:length:
.
unichar res = ((unichar)(400));
NSString *unencodedString = [NSString stringWithCharacters:&res length:1];
XCTAssertEqualObjects(unencodedString, @"Ɛ", @"");
static NSString *escape = @":/?&=;+!@#$()',*[]";
NSString *result = (__bridge_transfer NSString *)
CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef)unencodedString,
NULL,
(__bridge CFStringRef)escape,
kCFStringEncodingUTF8);
XCTAssertEqualObjects(result, @"%C6%90", @"");