0

我正在尝试使用路径字符串构建 NSURL。该字符串看起来不错,但是当我尝试将其放入 NSURL 时,它会得到一堆乱码。这是我用来构建 url 的代码:

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/.content/ Prezista-PI.pdf

2012-07-25 10:28:41.654 mxHub[44036:207] /Users/casey.borders/Library/Application扡潳畲整瑓楲杮䄀䅖獳瑥慃档e獡敳䍴捡敨楗桴剕㩌猀稳佥䕦瑮祲潆䭲:ㅱ䀲㨰䀴祥卸敲潭敶湅牴䙹牯敋㩹挀敲敲瑮枫驱猀瑥愠愠䕸瑮祲枫驱:慭䕸瑮祲稳枫驱猀瑥愠㩥洀桡枫驱䀀䄢䅖獳瑥慱档䥥瑮牥虑≬䄀䅖獳瑥慃档䥥瑮牥虑l湩楗桴楄獩楗桴楄獯虑祲:慤驱獕湩䕧据挚湩㩧污潬䍷獯祳潃瘾牥楳汤:惯䉮䍥汤敶玱摥洁湅潣楤莹杮:湩楗桴岸防攺据挚湩㩧攀瑸湥敤䱤杯栗防瑓楲杮湅潣椤杮攀瑸湥敤䱤杯栗惊䄀偖慬敹䥲整䅭捣獥䱳杯开捡散獳潌䅧牲祡攀敶瑮的灟慬敹䥲整䅭捣獥䱳杯䀀䄢偖慬敹䥲杯整䅭捣獥义《整湲污》恶祡牥瑉浥捁散獳潌䥧瑮牥虑l潬䅧灯数祡䄀偖慬敹䥲整䅭捣獥䱳杯癅湥t畮捻牥晏牡墙噤摩潥浡墙卥碗敢浮捩瑡瑕摕楬牴牴瑡e扯摕摕極牴牴瑡瑡慲牥晴晴整扬慲狝敦味摥測慲狝敦味摥測極牴牴瑡摕摕楬極獴敨泷湷潬湥獴敨湷潬湥獴扴湴潬摡摥畄慲楴汤瀀慬批捡卫防玱晏獦獦瑥瀀慬批捡卫獥楳汤䑉渀浵敢佲贾牥敶䅲摤敲獥敶䅲摤敲獳桃湡敧s敳牥摁牤獥剕我祡正慢獥剕我瑓牡摴瑡e畮扭牥晏敓浧湥獴摴湷潬摡摥开祡牥瑉浥捁散獳潌䕧敶瑮䀀䄢偖慬敹䥲整䅬獥䱳杯捣癒湥䥀瑮牥␥␥␥恶祡牥瑉浥捁散獳潌䕧敶瑮湉整湲污搀捩t┊@恶祡牥瑉浥牅潲䱲杯牥潲䱲杯牁慲y灟慬敹䥲整䕭牲牯潌开≀恶祡祡瑉浥牅潲䱲杯湉整湲污”恶祡牥瑉浥牅潲䱲杯湉整湲污䄀偖慬敹䥲整䕭牲牯潌䕧敶瑑攀牲牯潃浭湥t牉潲䑲浯楡n牲潲卲惊吓䍳挚灟慬敹䥲整䕭牲潌䕧敶瑮䀀䄢偖慬敹䥲整䕭牲牯潌䕧敶瑮湉整湲污;瑉浥牅潲䱲杯癅湥䥴瑮牥虑l碗剳捥牯楤杮攀牲牯楗桴漱慭湩挺杯挚㩥猎牥湉潦:潶捩䍥汤牴汯敬䕲摮汐祡正慢湉整牲灵楴汤:潶捩䍥汤牴汯敬䕲摮敒潣摲湉整牲灵楴汤:潶捩䍥汤牴毯敬偲慬捡批䉫晵敦䅲庆汩扡敬戺晵庆敦汩扡楯散潃瑮潲汱牥楄Ǭ卤玱祡湩㩧捣獥可畜畬畬:支持/iPhone 〪ᶀЀꀠ/Āࠀ쵠޴imulator/5。0/应用程序/C2C1975D-7FAB-4E6C-A091-DC389223CC57/Documents/.content/Demo.pdf

4

2 回答 2

4

这与 NSLog 有关,与您的网址无关 :)

尝试这个 :

NSString* path = [[AppSettings instance].contentRootPath stringByAppendingPathComponent: item.fileName];
NSLog(@"%@", path);
item.contentPath = [NSURL URLWithString:[path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"%@", item.contentPath.absoluteString);

for的第一个参数NSLog是一个格式字符串 - 这告诉 NSLog 可能有其他值要插入到输出中(这些是 NSLog 采用的其他可选参数 - 例如NSLog(@"%i", 5);将 %i 替换为 5)。

NSLog(path);很好,因为路径中没有任何特殊的格式字符,因此它会按照您的预期输出。

第二个NSLog有 % 字符 - 当您要求 % 转义路径时添加它们 :) 例如,您将“应用程序支持”中的空格替换为%20.

这意味着您的 url 现在包含格式代码%20S(S 是空格后的下一个字符,“支持”一词中的第一个字符)。

%S被解释NSLog为“获取给定的下一个参数并将其视为空终止的 c 字符串”。

不幸的是,您没有提供NSLog另一个参数 :) 但是,NSLog它不知道 - 它只是尽职尽责地按照告知的方式执行并获取堆栈中的下一个值并将其添加到输出字符串中。

堆栈上的下一个值是垃圾,这就是为什么你的输出是垃圾!

您可以看到损坏的值而不是路径中的空格出现 - 两个空格恰好后面跟着一个 S,所以NSLog在两个地方倾倒垃圾。这就是为什么在第一次加载垃圾之后你可以看到“支持/iPhone”和第二个“模拟器/5.0”之后:)

于 2012-07-25T14:51:43.097 回答
2

当您使用 NSLog(string) 时,该字符串被视为格式语句,并且任何 '%' 字符都将被解释。

尝试使用以下形式打印字符串:NSLog(@"%@", string)。作为一般性声明,您应该始终使用上述表格,而不是您正在使用的表格。

于 2012-07-25T14:51:35.857 回答