我是iOS开发新手,一般是Objective-C,但我已经创建了我正在尝试构建的应用程序的Android版本。开发iOS版本时的当前挂起是我尝试url编码字符串的问题。我尝试了两种不同的方法,都输出了同样非常奇怪的结果。
@implementation NSString (PhantomEx)
-(NSString *)urlEncode
{
NSLog(self);
NSString *encodedString = (NSString*)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8 ));
NSLog(encodedString);
return encodedString;
}
@end
调用时,第一个NSLog输出一个非常精细的未编码字符串:
http://api.example.com/?userid=42&cmd={"cmd":"CheckLogin","data":{
"username" : "joe@example.com",
"password" : "verysecurepassword"
}}&auth=08fef10b96ac69fcc4bdcf09c3e3d851
而第二个NSLog输出:
2014-03-18 12:52:06.228 phantom[9706:60b] http0X1.1A8A9AP-10470.0000000.000000api.example.com0.0000000.000000userid2610411153 pmd193317 –md23AheckLogin22C 148133072ata23A7-0X1.FCF0808D30DP+0220 10764sername2200X1.2E0C2351534P-1028222joe 5.902543e-310xample.com22C0X1.463C008D30DP-882220 0x1a8321cassword2200X1.70101P-1020222verysecurepassword20A1390253627800088 0x1.006a0c88p-1040uth360473608fef10b96ac69fcc4bdcf09c3e3d851
这个单独的方法产生相同的结果:
-(NSString *)urlEncode
{
NSString *charactersToEscape = @"!*'();:@&=+$,/?%#[]\" ";
NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet];
NSString *encodedString = [self stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
return encodedString;
}
另外,我意识到我正在尝试编码整个网址,而不仅仅是参数,我还没有改变那一点。但是,我不认为它会对当前的问题产生任何影响。
答案 0 :(得分:0)
我总是毫无问题地使用它。尝试使用较小的字符集,并查看是否可以确定是否有任何单个字符导致问题。同时将第四个参数更改为CFSTR。
-(NSString *)encodeURL:(NSString *)urlString
{
CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)urlString, NULL, CFSTR("!*'();:@&=+@,/?#[]"), kCFStringEncodingUTF8);
return (NSString *)CFBridgingRelease(newString);
}
答案 1 :(得分:0)
问题在于日志记录本身,NSLog
将第一个参数作为格式字符串并对其进行解析。
将其更改为NSLog(@"%@", encodedString);