Кодирование данных URL

К URL - кодируют строки, используют Базовые функции Основы CFURLCreateStringByAddingPercentEscapes и CFURLCreateStringByReplacingPercentEscapesUsingEncoding. Эти функции позволяют Вам указывать список символов для кодирования в дополнение к высокому ASCII (0x800xff) и непечатаемые символы.

Согласно RFC 3986, зарезервированные символы в URL:

      reserved    = gen-delims / sub-delims
 
      gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
 
      sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
                  / "*" / "+" / "," / ";" / "="
 

Поэтому к должным образом URL - кодируют строку UTF-8 для включения в URL, необходимо сделать следующее:

CFStringRef originalString = ...
 
CFStringRef encodedString = CFURLCreateStringByAddingPercentEscapes(
    kCFAllocatorDefault,
    originalString,
    NULL,
    CFSTR(":/?#[]@!$&'()*+,;="),
    kCFStringEncodingUTF8);

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

После повреждения URL в части можно декодировать каждую часть следующим образом:

CFStringRef decodedString = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(
    kCFAllocatorDefault,
    encodedString,
    CFSTR(""),
    kCFStringEncodingUTF8);