Кодирование данных URL
К URL - кодируют строки, используют Базовые функции Основы CFURLCreateStringByAddingPercentEscapes
и CFURLCreateStringByReplacingPercentEscapesUsingEncoding
. Эти функции позволяют Вам указывать список символов для кодирования в дополнение к высокому ASCII (0x80
–0xff
) и непечатаемые символы.
Согласно 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); |