Путаница с регистром, используемым кодировкой CFURLCreateStringByAddingPercentEscapes
Я хочу, чтобы была выполнена кодировка 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));
2 ответа
Другим, возможно, более элегантным, но более медленным способом было бы зацикливать вашу строку, преобразовывая каждый символ в строке один за другим (чтобы вы могли получить длину вашей строки, а затем получить из нее подстроку от местоположения 0 до длины-1, с каждый раз по одному символу, затем переводите только эту подстроку. Если возвращаемая строка имеет длину> 1, то CFURLCreateStringByAddingPercentEscapes
закодировать символ, и вы можете смело превращать регистр в строчные.
Во всех случаях вы добавляете возвращаемую (и, возможно, измененную) строку к изменяемой строке, и когда вы закончите, у вас будет именно то, что вы хотите для любой возможной строки. Несмотря на то, что это может показаться настоящей нагрузкой на процессор, реальность такова, что вы, вероятно, никогда не заметите лишних циклов потребления.
Аналогичным образом, второй подход заключается в том, чтобы сначала просто преобразовать всю строку, а затем скопировать ее побайтно в изменяемую строку, а если вы найдете "%", то поверните следующие два символа в нижний регистр. Просто немного другой способ решить проблему.
Вы можете использовать регулярное выражение для выполнения операции 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}
Он соответствует двум шестнадцатеричным символам, только если ему предшествует знак процента. Каждое совпадение затем повторяется и заменяется в изменяемой строке. Нам не нужно беспокоиться об изменениях смещения, потому что длина строки замены всегда одинакова.