ios - 对 url 字符串进行编码

标签 ios objective-c urlencode

我正在尝试使用 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/

相关文章:

iphone - Unity3D 与 UIView 的集成

ios - TableView 行与 Swift 中的数据不一致

tomcat - & 未使用 tomcat 7.0.47 编码为 &

javascript - 与页面上的元素交互时防止滑动事件

iphone - 在工具栏中单击 "Select All"按钮时如何插入复选标记?

ios - UICollectionView + AFNetworking + 自动滚动/分页?

ios - 应用程序 :openURL:sourceApplication:annotation: not found in iOS 8 的实现

ios - 每次滚动时 UITableViewCell 都会更改其标签值

java - 在 java 中使用 URLDecoder 将 % 解码为空格?

HTTP查询和URI编码疑惑