stringByAddingPercentEscapesUsingEncodingは使ってはいけない

NSStringstringByAddingPercentEscapesUsingEncodingは使ってはいけません。

名前からしてURLに使えない文字をエスケープしてくれることを期待できそうなが名前に反してURLに使えない文字をエスケープしないからです。
Tumblr関連アプリではiviewがはまり、tumbladdictもはまり、tumblr gearもはまった、メールアドレスに+が入っているとログインできないバグの原因は(たぶん)この思わせぶりな名前のメソッドのせいです。実際のところこのメソッドは

(0×20)"#%><[\]^`{|}

しかエスケープしません!つまりRFC2396で使用できない、もしくは予約語となっている文字である

$&+,/:;=?@

をエスケープしてくれない全く使いみちのないメソッドです(たしかにドキュメントにはRFCのことには触れずにただエスケープするとしか書かれてないけど)。

解決策

Google Code SearchでCFURLCreateStringByAddingPercentEscapesを検索するとたくさん出てくる

NSString* encodeURIComponent(NSString* s) {
    return [((NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
        (CFStringRef)s, 
        NULL, 
        (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
        kCFStringEncodingUTF8)) autorelease];
}

こういう方法が定石のようです。これでもエスケープすべき文字すべてをエスケープすることができるようになります。

こういうCocoaプログラマだったらいまさらみたいな常識、楽して身につける方法ないでしょうか。


About this entry