2

私のミュージック プレーヤー アプリは、曲、アーティスト、アルバム名を REST API 経由で Last.fm に送信できる必要があります。これらの値を適切に POST するには、URL セーフになるようにエンコードする必要があります (&、/、+ などを置き換えます)。

私は多くの調査を行ってきましたが、自分に合った答えが見つかりません。私が Web とここ 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 で検索されたときに見つかります。

4

1 に答える 1

2

NSLog文字列が正しく表示されない理由は、最初の引数としてformat-stringを受け入れる最初の引数としてURLを渡したことが原因である可能性があります。パーセント文字はすべて、format-stringディレクティブとして解釈されます。

次のようにURLをログに記録する必要があります。

NSLog(@"%@", urlToLog);

__bridgeまた、コードの左端が正しくありません。CFURLCreateStringByAddingPercentEscapes名前に「Create」が含まれているため、返される文字列を解放する必要があります。ARCにそれを処理するように指示したいので、所有権をARCに譲渡__bridge_transferする必要があります。

NSString * encodedString = (__bridge_transfer NSString *)CFURLCreateString...
于 2012-09-11T14:42:01.070 に答える