Cocoa Fundamentals Categoryの例−より使いやすいURL encoding手法−

3304 ワード

RESTFulベースのアプリケーションをしている場合は、伝達されたパラメータを符号化する必要があります.例えば、メッセージを伝えるには:
China,Beijing,Haidian
URLコードを経て、この文字列は
China%20Beijing%20%Haidian

iOSでは、以下のNSStringの方法で簡単にURL符号化を実現できます.
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding

したがって、次の方法で文字列を復元できます.
stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding
は次の完全な例です.
NSString *rawText = @"One Broadway, Cambridge, MA";
 
NSString *encodedText = [rawText stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Encoded text: %@", encodedText);
NSString *decodedText = [encodedText stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Original text: %@", decodedText);

出力:
Encoded text: One%20Broadway,%20Cambridge,%20MA
Original text: One Broadway, Cambridge, MA
今まで、すべてはとてもすばらしくて、NSStringはとても良い仕事ができます.しかしstringByAddingPercentEscapesUsingEncodingはiOSの予約ワード、例えば&および/を処理できない.
この例を見てみましょう.
NSString *rawText = @"Bed Bath & Beyond - URL=http://www.bedbathandbeyond.com/";
 
NSString *encodedText = [rawText stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Encoded text: %@", encodedText);
NSString *decodedText = [encodedText stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Original text: %@", decodedText);

出力:
Bed%20Bath%20&%20Beyond%20-%20URL=http://www.bedbathandbeyond.com/Original text: Bed Bath & Beyond – URL=http://www.bedbathandbeyond.com/
注意:&と/は符号化されていません.
もちろん、このような小さな問題には解決策があるに違いありません.googleがどのようにしているかを見てみましょう.ソースコードを先に上げる
#import "GTMNSString+URLArguments.h"
#import "GTMGarbageCollection.h"

@implementation NSString (GTMNSStringURLArgumentsAdditions)

- (NSString*)gtm_stringByEscapingForURLArgument {
  // Encode all the reserved characters, per RFC 3986
  // (<http://www.ietf.org/rfc/rfc3986.txt>)
  CFStringRef escaped = 
    CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                            (CFStringRef)self,
                                            NULL,
                                            (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                            kCFStringEncodingUTF8);
  return GTMCFAutorelease(escaped);
}

- (NSString*)gtm_stringByUnescapingFromURLArgument {
  NSMutableString *resultString = [NSMutableString stringWithString:self];
  [resultString replaceOccurrencesOfString:@"+"
                                withString:@" "
                                   options:NSLiteralSearch
                                     range:NSMakeRange(0, [resultString length])];
  return [resultString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}

@end



見覚えのあるNSString(GTMNSStringURLArgumentsAdditions)は、CategoryでNStringに新しい方法を追加したのではないでしょうか.
このファイルをプロジェクトに追加すると、NSStringクラスのインスタンスとサブクラスのインスタンスはrfc 3968標準をサポートする符号化と復号化能力を持っています.coolでしょう.
Googleソースリンクアドレス