2013-06-07 11 views
1

Я хочу, чтобы кодировка URL была выполнена. Моя входная строка «ChBdgzQ3qUpNRBEHB + bOXQNjRTQ =»Путаница с футляром, используемым CFURLCreateStringByAddingPercentEscapes encoding

я получаю результат, как «ChBdgzQ3qUpNRBEHB% 2BbOXQNjRTQ% 3D», который является полностью правильным, за исключением случая, который будет закодирован.

В идеале это должно было быть «ChBdgzQ3qUpNRBEHB% 2bbOXQNjRTQ% 3d« вместо вывода, который я получаю. i.e Я должен был получить % 2b и% 3d вместо % 2B и% 3D.

Это можно сделать?

Кода я использовал, как показано ниже:

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

Почему это имеет значение? HTTP-сервер должен принимать проценты экранов в форме верхнего или нижнего регистра. –

+0

Фактически эта строка является хеш-кодом, который я отправляю как HTTP-заголовок, который чувствителен к регистру, поэтому проблема :( – mayuur

+0

Получил ответ по этой ссылке: http://stackoverflow.com/a/8088484/593336 – mayuur

ответ

0

Другой, возможно, более элегантные, но медленнее всего было бы перебрать вашу строку, преобразуя каждый символ в строке один за другим (таким образом вы получите длину вашей строки, а затем получить подстроку от него от места 0 до длины-1 с одним символом каждый раз, а затем перевести именно эту подстроку. Если возвращаемая строка имеет длину> 1, то CFURLCreateStringByAddingPercentEscapes закодировал символ, и вы можете безопасно поверните корпус в нижний регистр.

Во всех случаях вы добавляете возвращенное (и, возможно, модификацию d) строка в изменяемую строку, и когда вы закончите, вы получите именно то, что хотите для любой возможной строки. Несмотря на то, что это, по-видимому, настоящий босс процессора, в действительности вы, вероятно, никогда не заметите лишние потребляемые циклы.

Аналогичным образом, второй подход состоял бы в том, чтобы сначала преобразовать всю строку, а затем скопировать его байтом в изменяемую строку, а если вы найдете «%», то переведите следующие два символа в нижний регистр. Просто немного другой способ разрезать проблему.

0

Вы можете использовать регулярные выражения для выполнения операции поста:

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} 

Это соответствует двум шестнадцатеричным символам, только если предшествуют знак процента , Каждое совпадение затем повторяется и заменяется в изменяемой строке. Нам не нужно беспокоиться о смещениях, потому что строка замены всегда имеет одинаковую длину.

 Смежные вопросы

  • Нет связанных вопросов^_^