我正在尝试使用 Objective-c 编码 url 字符串
// 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
但是结果并不是我所期望的。因为我得到%C6%90
使用其他编程语言。
如您所见,Objective-C 结果是 %C2%90
,但我期望%C6%90
.
我的错误在哪里?我做错了什么吗?
最佳答案
问题是 NSString *unencodedString = [NSString stringWithFormat:@"%c",res]
没有做你认为它做的事情。 char res
不能保存大于 128 的值(unsigned char
为 256)。
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", @"");
这是一个有效的示例。
NSString *unencodedString = @"Ɛ";
static NSString *escape = @":/?&=;+!@#$()',*[]";
NSString *result = (__bridge_transfer NSString *)
CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef)unencodedString,
NULL,
(__bridge CFStringRef)escape,
kCFStringEncodingUTF8);
XCTAssertEqualObjects(result, @"%C6%90", @"");
更新
如果您希望这样的示例正常工作,请使用 unichar
和 -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", @"");
关于ios - 对 url 字符串进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21958725/