11

GET リクエストでタイムゾーン オフセットを含むタイムスタンプを渡す必要があります。

2009-05-04T11:22:00+01:00

これは、受信する PHP スクリプトへの 2 つの引数 "2009-05-04T11:22:00" と "01:00" のように見えます (これは制御できません)。

NSURL はプラス記号をエンコードしませんが、文字列を使用して NSURL を作成すると

2009-05-04T11:22:00%2B01:00

私が最終的に含むURLは次のとおりです。

2009-05-04T11:22:00%252B01:00

エンコードされたプラス記号を保持する方法、または単に NSURL が何かをエンコードするのを防ぐ方法はありますか?

4

7 に答える 7

13

私にとってうまくいったのは、UTF8変換を行い、+記号を%2Bに置き換えることでした:

NSString *urlString =
    [NSString stringWithFormat:@"%@/iphone/push/create?pn[token]=%@&pn[send_at]=%@",
     kHTTPURL, appDelegate.deviceAPNToken, [dateTimeToUse description]];

urlString =
    [[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
     stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
于 2010-02-15T22:00:28.350 に答える
3

文字列は URL エンコードする必要があります。

役立つ NSString のカテゴリを次に示します。

NSString+Additions.h

@interface NSString (Additions)

- (NSString *)stringByURLEncoding;

NSString+Additions.m

#import "NSString+Additions.h"

@implementation NSString (Additions)

- (NSString *)stringByURLEncoding {
    return (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                           (CFStringRef)self,
                                                           NULL,
                                                           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                           CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
}
于 2013-06-18T05:22:20.977 に答える
2

元の問題に対する良い解決策はないと思うので、答えとして回避策を提供することもできます。

プラス記号 (+) は URL で完全に有効であるため、私の解決策は時間を GMT に変換し、文字列からタイムゾーン/DST オフセットを削除することでした。私の場合、Web サーバーによって生成されたタイムスタンプのみに関心があるため、常に同じであるため、読者が以下のsecondsFromGMTの値を決定する演習として残します。

NSString *gmtWhen = [[self descriptionWithCalendarFormat:nil
                           timeZone:[NSTimeZone
                           timeZoneForSecondsFromGMT:secondsFromGMT
                     ] locale:nil] stringByReplacingOccurrencesOfString:@" +0000" withString:@""];
于 2009-05-23T07:38:23.057 に答える
2

引数として含めたいテキストに対してNSStringのメソッドを使用します。stringByAddingPercentEscapesUsingEncoding:

その名前が示すように、このメソッドは、レシーバーの URL セーフ バージョンを含む自動解放された文字列を変換して返します。

于 2009-05-22T16:39:41.853 に答える
1

URLComponents (Swift 3)を使用する場合の解決策:

var params = ["email": "user+ios-default@example.com", "name": "John Brown"]
var components = URLComponents(string: "http://www.example.com")!
components.path = "/login"
components.queryItems = params.map { URLQueryItem(name: $0, value: $1) }

let url_NoFix = components.url!
// http://www.example.com/login?name=John%20Brown&email=user+ios-default@example.com

let cs = CharacterSet(charactersIn: "+").inverted
let q =  components.percentEncodedQuery?.addingPercentEncoding(withAllowedCharacters: cs)
components.percentEncodedQuery = q

let url_Fixed = components.url!
// http://www.example.com/login?name=John%20Brown&email=user%2Bios-default@example.com
于 2016-11-06T01:12:08.143 に答える
0

エンコードされたプラス (%2B) (すべての文字で動作します) を取得するには、次のように使用CFURLCreateStringByAddingPercentEscapes します。

/**
 get parameterized url from url and query parameters.
 */
+(NSString *)getParameterizedUrl:(NSString *)url withParameters:(NSDictionary *)queryDictionary
{
    NSMutableArray *mutablePairs = [NSMutableArray array];
    for (NSString *key in queryDictionary) {
        [mutablePairs addObject:[NSString stringWithFormat:@"%@=%@", CTPercentEscapedQueryStringKeyFromStringWithEncoding(key, NSUTF8StringEncoding), CTPercentEscapedQueryStringValueFromStringWithEncoding(queryDictionary[key], NSUTF8StringEncoding)]];
    }

    return [[NSString alloc]initWithFormat:@"%@?%@",url,[mutablePairs componentsJoinedByString:@"&"]];
}

static NSString * const kCharactersToBeEscapedInQueryString = @":/?&=;+!@#$()',*";

static NSString * CTPercentEscapedQueryStringKeyFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
    static NSString * const kCharactersToLeaveUnescapedInQueryStringPairKey = @"[].";

    return (__bridge_transfer  NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kCharactersToLeaveUnescapedInQueryStringPairKey, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding));
}

static NSString * CTPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
    return (__bridge_transfer  NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding));
}

そして、コードで次のように使用します

NSMutableDictionary *params = [[NSMutableDictionary alloc]init];
[params setObject:@"2009-05-04T11:22:00+01:00" forKey:@"timestamp"];

NSString *urlString = [self getParameterizedUrl:@"http://www.example.com" withParameters:params];
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
于 2015-06-29T10:50:20.920 に答える