黒毛和牛モモバラ切り落し100g298円

iPhoneアプリを作ってます。リリースノートとか用ブログです。

JavaScriptのencodeURIComponent相当のメソッドのObjective-Cでの実装

NSURLConnection等でHTTPリクエストを送信する際、日本語を含むURLは%エスケープする必要があるのですが、NSStringのstringByAddingPercentEscapesUsingEncodingはスペース等の一部の文字をエスケープするだけで、マルチバイト文字はエスケープしてくれません。

stringByAddingPercentEscapesUsingEncodingではなくCFURLCreateStringByAddingPercentEscapesを使うのが正解のようなのですが、エスケープの仕方に色んな例があり、どれが正解なのかよく分からなかったのでJavaScriptのencodeURIComponentの実装を調べてみる事にしました。

で、groundwalker.comのjavascript: escape(), encodeURI(), encodeURIComponent() 比較によると、JavaScriptのencodeURIComponentで変換されない記号は !'()*-._~ のみのようですので、以下の実装を使うことにしました。

NSString+URL.h

#import <Foundation/Foundation.h>

@interface NSString (URL)

- (NSString *)encodeURIComponent;
- (NSString *)decodeURIComponent;

@end

NSString+URL.m

#import "NSString+URL.h"

@implementation NSString (URL)

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

- (NSString *)decodeURIComponent
{
    return [self stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}

decodeURIComponentはstringByReplacingPercentEscapesUsingEncodingと変わらないので無くても良いのですが、セットで用意しといが方が使い易いと思います。