我不得不从stringByAddingPercentEscapesUsingEncoding切换到CFURLCreateStringByAddingPercentEscapes,因为它不会转义问号(?)。我好奇它究竟转义了什么,以及部分转义与RFC 3986的背景。
我不得不从stringByAddingPercentEscapesUsingEncoding切换到CFURLCreateStringByAddingPercentEscapes,因为它不会转义问号(?)。我好奇它究竟转义了什么,以及部分转义与RFC 3986的背景。
在使用CFStringRef进行转换时要小心不要泄漏内存。以下是我设计的用于处理拉丁字符和其他字符的方法。我使用它来转义我的参数而不是整个URL。根据您的使用情况,您可能需要添加或删除“escapeChars”中的字符。
CFStringRef escapeChars = (CFStringRef)@"%;/?¿:@&=$+,[]#!'()*<>¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ \"\n";
NSString *encodedString = (__bridge_transfer NSString *) CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge_retained CFStringRef) url, NULL, escapeChars, kCFStringEncodingUTF8);
已经创建了一些适合您需要的好类别:
http://iosdevelopertips.com/networking/a-better-url-encoding-method.html
http://www.cocoanetics.com/2009/08/url-encoding/
留下某些字符的原因超出我的理解……除了说函数的定义是:使用给定的编码返回接收器的表示形式,以确定将接收器转换为合法URL字符串所需的百分比转义。
完全正确地说,+和&是URL中的合法字符,而空格不是。因此,该方法将正确地转义空格,但保留+和&。
阅读RFC2396 http://www.ietf.org/rfc/rfc2396.txt - 定义了一组保留和非保留字符。我猜测,stringByAddingPercentEscapesUsingEncoding 不会对这些字符进行转义。