Ho dovuto passare da stringByAddingPercentEscapesUsingEncoding a CFURLCreateStringByAddingPercentEscapes perché non sfugge punti interrogativi (?). Sono curioso che cosa esattamente lo fa sfuggire, e la logica dietro la fuoriuscita parziale vs RFC 3986.Quali sono i caratteri che stringByAddingPercentEscapesUsingEncoding escapes?
risposta
Alcuni buoni categorie sono state create per fare proprio quello che vi serve: http://iosdevelopertips.com/networking/a-better-url-encoding-method.html http://www.cocoanetics.com/2009/08/url-encoding/
Il razionale per lasciare certi personaggi fuori è oltre me ... tranne per dire che la definizione della funzione è: Returns a representation of the receiver using a given encoding to determine the percent escapes necessary to convert the receiver into a legal URL string.
Per essere completamente corretti, + e & sono caratteri legali all'interno di un URL, mentre uno spazio non lo è. Quindi il metodo uscirà correttamente da uno spazio, ma lascia + intatto e & intatto.
Lettura RFC2396 http://www.ietf.org/rfc/rfc2396.txt - è definito un set di caratteri riservati e non riservati. La mia ipotesi è che nessuno di questi personaggi sia sfuggito da stringByAddingPercentEscapesUsingEncoding.
Fare attenzione a non perdere memoria nelle conversioni quando si utilizza CFStringRef. Ecco cosa mi è venuto in mente per lavorare con personaggi latini e altri. Lo uso per sfuggire ai miei parametri, non all'intero URL. A seconda del caso d'uso, potrebbe essere necessario aggiungere o rimuovere caratteri da "escapeChars"
CFStringRef escapeChars = (CFStringRef)@"%;/?¿:@&=$+,[]#!'()*<>¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ \"\n";
NSString *encodedString = (__bridge_transfer NSString *) CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge_retained CFStringRef) url, NULL, escapeChars, kCFStringEncodingUTF8);
Spero che questo aiuti.
Ora ho solo bisogno di pochi minuti per leggere quel documento ... :) –