ios - 需要对 URL 进行 NSString 编码。 CFURLCreateStringByAddingPercentEscapes 破坏了我的字符串

标签 ios cocoa-touch rest nsstring urlencode

我的音乐播放器应用需要能够通过 REST API 将歌曲、艺术家和专辑名称发送到 Last.fm。为了正确 POST 这些值,我需要对它们进行编码,以便它们是 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...

关于ios - 需要对 URL 进行 NSString 编码。 CFURLCreateStringByAddingPercentEscapes 破坏了我的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12372187/

相关文章:

ios - NSKeyedArchiver 不持久保存数据

ios - 即时更改 UIPopoverController

php - 如何重置 CURLOPT_CUSTOMREQUEST

objective-c - iCloud NSMetadata 查询结果为空白

objective-c - 允许根据 url 字符串选择表格 View 单元格

ios - 使用 "The network connection was lost."在 swift 中随机获取 "Alamofire.request"

java - 如何在不对 URL 进行硬编码的情况下调用我的 REST API get 方法?

ios - SpriteKit - iOS 7 - iAd 集成错误

ios - 如何为 UIButton 设置默认状态图像?

python - Django 结果返回绝对 URL