我的音乐播放器应用程序需要能够通过REST API将歌曲,艺术家和专辑名称发送到Last.fm。为了正确发布这些值,我需要对其进行编码,以便它们是URL安全的(替换&,/,+等)。
我已经做了很多研究,但是找不到适合我的答案。我在网上以及在StackOverflow上找到的最常见的答案是:
NSString * encodedString = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,(__bridge CFStringRef)stringToEncode,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8 );
但是,此结果似乎不是我应该期望的。 NSLog示例显示了之前和之后的结果:
艺术家:
2012-09-11 10:20:27.803 albums[7647:5c03] Depeche Mode
2012-09-11 10:20:27.804 albums[7647:5c03] Depeche2ode
歌曲:
2012-09-11 10:20:27.807 albums[7647:5c03] I Want It All (Album Version)
2012-09-11 10:20:27.808 albums[7647:5c03] I2ant2t-0X1.1A1A10D39EP-485ll228Album2ersion2
相册:
2012-09-11 10:20:27.810 albums[7647:5c03] Playing The Angel
2012-09-11 10:20:27.811 albums[7647:5c03] Playing2he-0X1.1A1A10D39EP-485ngel
不仅要用转义代码替换保留的字符,还要对我的字符串进行处理。
我已经尝试过这样做的NSString方法,并且得到了同样的东西:
NSString *encodedString = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
艺术家:
2012-09-11 10:29:53.780 albums[7675:5503] Depeche Mode
2012-09-11 10:29:53.787 albums[7675:5503] Depeche2ode
歌曲:
2012-09-11 10:29:53.789 albums[7675:5503] I Want It All (Album Version)
2012-09-11 10:29:53.790 albums[7675:5503] I2ant2t-0X1.1A1A100A78P-485ll2Album2ersion)
相册:
2012-09-11 10:29:53.792 albums[7675:5503] Playing The Angel
2012-09-11 10:29:53.793 albums[7675:5503] Playing2he-0X1.1A1A100A78P-485ngel
我进行了广泛搜索,没有发现完全相同的问题。上面列出的解决方案(建议在数十个博客和SO帖子上使用)似乎对其他人也有用。
我不太了解字符串编码。我从未在其他平台上处理过它,所以我无法告诉您我尝试用转义码替换的字符串是如何编码的。我可以告诉你,我是从MPMediaItem方法
valueForKey:MPMediaItemPropertyTitle
获得它的,所以无论它是什么,Apple都在返回。从该外观返回的字符串是在NSLogged或UI中找到的。 最佳答案
字符串显示不正确的原因很可能是因为您将URL作为第一个参数传递给NSLog
,该参数接受第一个参数的格式字符串。任何百分比字符都将被解释为格式字符串指令。
您需要这样记录您的URL:
NSLog(@"%@", urlToLog);
另外,您代码中最左边的
__bridge
不正确。 CFURLCreateStringByAddingPercentEscapes
的名称中包含“Create”,这意味着它所返回的字符串需要释放。我们想告诉ARC为我们处理,因此我们应该使用__bridge_transfer
将所有权转移到ARC:NSString * encodedString = (__bridge_transfer NSString *)CFURLCreateString...