1. ホーム
  2. iphone

Objective-c iPhone パーセントで文字列をエンコードする?

2023-11-02 18:52:18

質問

私はこれらの特定の文字のパーセントエンコード文字列を取得したいのですが、objective-cでそれを行うにはどうすればよいですか?

Reserved characters after percent-encoding
!   *   '   (   )   ;   :   @   &   =   +   $   ,   /   ?   #   [   ]
%21 %2A %27 %28 %29 %3B %3A %40 %26 %3D %2B %24 %2C %2F %3F %23 %5B %5D

パーセンテージエンコードwiki

この文字列でテストして、動作するかどうか確認してください。

myURL = @"someurl/somecontent"

のような文字列にしたい。

myEncodedURL = @"someurl%2Fsomecontent"

で試してみたところ stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding で試してみましたが、うまくいかず、結果は元の文字列と同じままです。アドバイスをお願いします。

どのように解決するのですか?

私は、両方の stringByAddingPercentEscapesUsingEncoding:CFURLCreateStringByAddingPercentEscapes() は不適当である。 その NSString メソッドではかなりの数の文字が欠落しますし、CF関数ではどの(特定の)文字をエスケープしたいかを指定するだけです。 正しい指定は、小さなセットを除くすべての文字をエスケープすることです。

これを解決するために、私は NSString カテゴリメソッドを作成し、文字列を適切にエンコードするようにしました。 これは、以下のものを除いてすべてパーセントエンコードします。 [a-zA-Z0-9.-_~] としてエンコードし、スペースも + (としてエンコードします。 この仕様では ). また、unicode文字のエンコーディングも適切に処理されます。

- (NSString *) URLEncodedString_ch {
    NSMutableString * output = [NSMutableString string];
    const unsigned char * source = (const unsigned char *)[self UTF8String];
    int sourceLen = strlen((const char *)source);
    for (int i = 0; i < sourceLen; ++i) {
        const unsigned char thisChar = source[i];
        if (thisChar == ' '){
            [output appendString:@"+"];
        } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' || 
                   (thisChar >= 'a' && thisChar <= 'z') ||
                   (thisChar >= 'A' && thisChar <= 'Z') ||
                   (thisChar >= '0' && thisChar <= '9')) {
            [output appendFormat:@"%c", thisChar];
        } else {
            [output appendFormat:@"%%%02X", thisChar];
        }
    }
    return output;
}