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と変わらないので無くても良いのですが、セットで用意しといが方が使い易いと思います。