【问题标题】:Encode url string [duplicate]编码url字符串[重复]
【发布时间】:2014-02-22 18:42:15
【问题描述】:

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

我的错误在哪里?我是不是做错了什么?

【问题讨论】:

  • 你的输入是什么,你期望什么输出?
  • 他希望输出在所有情况下都匹配,@L.B;另外,我想知道为什么 Alexander 将“1”的起始字符与“417”异或?
  • 输入是代码为 400 的字符。我希望得到 url 编码的字符串 %C6%C90。从问题中删除异或。
  • 您在哪个部分/语言中有问题HttpUtility.UrlEncode(((char)400).ToString()) 返回您所说的内容。
  • Objective-C 代码返回错误值%C2%90。其他语言返回%C6%90。我不知道为什么会这样?

标签: ios objective-c urlencode


【解决方案1】:

问题是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", @"");

【讨论】:

  • 这就是我的怀疑。谢谢。
  • @Alexander,我更新了我的答案,找到了一个可行的样本。
  • 非常感谢!检查它,工作正常。
  • @Alexander,最后一件事,您还可以使用 [NSString stringWithFormat:@"%C", res] 和 unichar res。注意:%C 是大写的 C。
猜你喜欢
  • 2011-06-21
  • 2016-09-30
  • 2016-08-19
  • 2021-05-16
  • 1970-01-01
  • 2012-09-11
  • 2014-02-19
  • 2017-11-20
相关资源
最近更新 更多