我正在尝试使用路径字符串构建NSURL。字符串看起来很好但是当我尝试将它放在NSURL中时,它会得到一堆乱码。这是我用来构建网址的代码:
NSString* path = [[AppSettings instance].contentRootPath stringByAppendingPathComponent: item.fileName];
NSLog(path);
item.contentPath = [NSURL URLWithString:[path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSLog(item.contentPath.absoluteString);
这是日志:
2012-07-25 10:28:39.983 mxHub [44036:207] /Users/casey.borders/Library/Application Support / iPhone Simulator / 5.0 / Applications / C2C1975D-7FAB-4E6C-A091-DC389223CC57 / Documents / 。内容/ PREZISTA-PI.pdf
2012-07-25 10:28:41.654 mxHub [44036:207] /Users/casey.borders/Library/Application扡潳整整慃慃e e e e档e敳捡捡捡捡捡楗楗楗剕㩌猀稳佥䕦瑮祲潆䭲祥:ㅱ䀲㨰䀴8敲潭敶湅牴䙹牯敋㩹挀牵敲瑮枫驱猀瑥愠䕸瑮祲枫驱:慭䕸瑮祲枫驱猀瑥愠卸稳㩥洀硡枫驱䀀䄢䅖獳瑥慃档䥥瑮牥虑≬䄀䅖獳瑥慃档䥥瑮牥虑升湩莹楗桴楄琐潩虑祲:慤慑獕湩䕧据挚湩㩧污潬䱷獯祳潃瘾牥楳汤:惯䉮䍥汤敶玱摥洁湅潣楤杮:湩莹楗桴栗慑攺据挚湩㩧攀瑸湥敤䱤杯栗慑瑓楲杮湅潣楤杮攀瑸湥敤䱤杯栗慑䄀偖慬敹䥲整䅭捣獥䱳杯开捡散獳潌䅧牲祡攀敶瑮小号灟慬敹䥲整䅭捣獥䱳杯䀀䄢偖慬敹䥲整䅭捣獥䱳杯湉整湲污“恶汐祡牥瑉浥捁散獳潌䥧瑮牥虑升潬䅧牲祡䄀偖慬敹䥲整䅭捣獥䱳杯癅湥吨畮扭牥晏牄灯数噤摩潥墙浡獥碗摮捩瑡摥楂牴瑡Ë扯敳癫摥楂牴瑡Ë畮扭牥晏祂整味慲狝敦牲摥渀浵敢佲卦慑汬小号畤慲楴汤捴敨d敳浧湥獴漱湷潬摡摥畄慲楴汤瀀慬批捡卫慑玱晏獦瑥瀀慬批捡卫獥楳汤䑉渀浵敢佲卦牥敶䅲摤敲獳桃湡敧小号敳癫牥摁牤獥小号剕我汰祡慢正瑓牡䑴瑡Ë畮扭牥晏敓浧湥獴漱湷潬摡摥开汰祡牥瑉浥捁散獳潌䕧敶瑮䀀䄢偖慬敹䥲整䅭捣獥䱳杯癅湥䥴瑮牥虑≬吀ɽⱒñ恶汐祡牥瑉浥捁散獳潌䕧敶瑮湉整湲污搀捩t┊@恶汐祡牥瑉浥牅潲䱲杯开牥潲䱲杯牁慲ÿ灟慬敹䥲整䕭牲牯潌g≀恶汐祡牥瑉浥牅潲䱲杯湉整湲污“恶汐祡牥瑉浥牅潲䱲杯湉整湲污䄀偖慬敹䥲整䕭牲牯潌䕧敶瑮攀牲牯潃浭湥吨牥潲䑲浯楡ñ牥潲卲慑畴䍳挚Ë灟慬敹䥲整䕭牲牯潌䕧敶瑮䀀䄢偖慬敹䥲整䕭牲牯潌䕧敶瑮湉整湲污“恶汐祡牥瑉浥牅潲䱲杯癅湥䥴瑮牥虑升碗剳捥牯楤杮攀牲牯楗桴漱慭湩挺挚㩥猎牥湉潦:潶捩䍥汤牴汯敬䕲摮汐祡慢正湉整牲灵楴汤:潶捩䍥汤牴汯敬䕲摮敒潣摲湉整牲灵楴汤:潶捩䍥汤牴敬偲慬批捡䉫晵敦䅲庆汩扡敬戺晵敦㩲瘀楯散潃瑮潲汬牥楄卤慑玱汐祡湩㩧畳捣獥晰汵祬:upport / iPhone㈜ǪᶀЀꀠ/Āࠀ쵠imulator /5.0/Applications/C2C1975D-7FAB-4E6C-A091-DC389223CC57/Documents/.content/Demo.pdf
答案 0 :(得分:4)
与NSLog有关,与您的网址无关:)
试试这个:
NSString* path = [[AppSettings instance].contentRootPath stringByAppendingPathComponent: item.fileName];
NSLog(@"%@", path);
item.contentPath = [NSURL URLWithString:[path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"%@", item.contentPath.absoluteString);
NSLog
的第一个参数是格式字符串 - 这告诉NSLog可能有其他值要插入到输出中(这些是NSLog采用的其他可选参数 - 例如NSLog(@"%i", 5);
用5)替换%i。
NSLog(path);
很好,因为路径中没有任何特殊的格式化字符,因此它会按预期输出。
第二个NSLog
包含%字符 - 当您要求%转义路径时添加了它们:)例如,您将“应用程序支持”中的空格替换为%20
。
这意味着您的网址现在包含格式代码%20S
(S是空格后面的下一个字符,即“支持”一词中的第一个字符。)
%S
被NSLog
解释为'接受我给出的下一个参数并将其视为空终止的c-string'。
不幸的是,你没有给NSLog
另一个参数:)但是,NSLog
并不知道 - 它只是尽职尽责,因为它被告知并在堆栈上取下一个值并添加它到输出字符串。
堆栈上的下一个值是垃圾,这就是为什么输出是垃圾!
你可以看到出现了损坏的值而不是路径中的空格 - 这两个空格后面跟着一个S,所以NSLog
在两个地方倾倒垃圾。这就是为什么在第一次加载垃圾后你可以看到'upport / iPhone'并在第二次'imulator / 5.0'之后:)
答案 1 :(得分:2)
当您使用NSLog(字符串)时,该字符串将被视为格式语句,并且将解释任何“%”字符。
尝试使用以下格式打印字符串:NSLog(@“%@”,string)。作为一般性陈述,您应始终使用上述表格,而不是您正在使用的表格。