Domanda

I'm trying to encode url string using Objective-c

// 1. Get string
char res = ((char)(400));
NSString *unencodedString = [NSString stringWithFormat:@"%c",res];

// 2. Encode string
static NSString *escape = @":/?&=;+!@#$()',*[]";
NSString *result = (__bridge_transfer  NSString *)
CFURLCreateStringByAddingPercentEscapes(
                                        NULL,
                                        (__bridge CFStringRef)unencodedString,
                                        NULL,
                                        (__bridge CFStringRef)escape,
                                        kCFStringEncodingUTF8);
// result = %C2%90

But result is not that I expect. Because I get %C6%90 using other programming languages.

As you see Objective-C result is %C2%90, but I expect %C6%90.

Where is my error? Am I do something wrong?

È stato utile?

Soluzione

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", @"");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top