我的音乐播放器应用程序需要能够通过 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 中查找从该外观返回的字符串。