1

我希望完成 URL 编码。我的输入字符串是“ ChBdgzQ3qUpNRBEHB+bOXQNjRTQ=

我得到一个输出为“ ChBdgzQ3qUpNRBEHB%2BbOXQNjRTQ%3D ”,除了被编码的情况外,这是完全正确的。

理想情况下,它应该是“ ChBdgzQ3qUpNRBEHB%2bbOXQNjRTQ%3d ”而不是我得到的输出。即我应该得到%2b 和 %3d而不是%2B 和 %3D

这可以做到吗?

我使用的代码如下:

NSString* inputStr = @"ChBdgzQ3qUpNRBEHB+bOXQNjRTQ=";
NSString* outputStr = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                          (CFStringRef)inputStr,
                                                                          NULL,
                                                                          (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                                          CFStringConvertNSStringEncodingToEncoding(encoding));
4

2 回答 2

0

另一种可能更优雅但速度较慢的方法是循环遍历您的字符串,逐个转换字符串中的每个字符(这样您就可以获取字符串的长度,然后从中获取从位置 0 到长度-1 的子字符串,使用每次一个字符,然后只翻译那个子字符串。如果返回的字符串的长度> 1,则CFURLCreateStringByAddingPercentEscapes对字符进行编码,您可以安全地将大小写转换为小写。

在所有情况下,您都将返回的(可能已修改的)字符串附加到可变字符串,完成后,您就可以得到任何可能的字符串所需的内容。尽管这看起来是一个真正的处理器消耗,但实际情况是您可能永远不会注意到额外消耗的周期。

同样,第二种方法是先转换整个字符串,然后将其逐字节复制为可变字符串,如果找到“%”,则将接下来的两个字符转换为小写。只是一种稍微不同的方式来解决问题。

于 2013-06-07T13:24:02.653 回答
0

您可以使用正则表达式来执行 post 操作:

NSMutableString *finalStr = outputStr.mutableCopy;
NSRegularExpression *re = [[NSRegularExpression alloc] initWithPattern:@"(?<=%)[0-9A-F]{2}" options:0 error:nil];

for (NSTextCheckingResult *match in [re matchesInString:escaped options:0 range:NSMakeRange(0, escaped.length)]) {
    [finalStr replaceCharactersInRange:match.range withString:[[escaped substringWithRange:match.range] lowercaseString]];
}

代码使用这个正则表达式:

(<?=%)[0-9A-F]{2}

它匹配两个十六进制字符,前提是前面有一个百分号。然后在可变字符串中迭代和替换每个匹配项。我们不必担心偏移量的变化,因为替换字符串的长度总是相同的。

于 2015-06-09T08:19:04.057 回答