私のミュージック プレーヤー アプリは、曲、アーティスト、アルバム名を 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 で検索されたときに見つかります。