簡體   English   中英

URL的編碼字符串

[英]encoding string for URL

我必須將數據從Iphone應用程序發布到php頁面,因此我需要正確編碼參數,轉換特殊字符...

具體來說,我需要發送iPhone的UDID。

我在網絡上發現了很多幫助將String編碼為參數的方法,但是出現了一個奇怪的錯誤。

我正在使用此功能:

- (NSString *)URLEncodeString:(NSString *)string { 

NSString *result =
   (NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
    (CFStringRef)string, NULL, CFSTR("'\"?=&+<>;:-"), kCFStringEncodingUTF8);

return [result autorelease];}

看來是正確的,但是當我使用它時,結果卻不是我所期望的。

這是代碼:

UIDevice *device = [UIDevice currentDevice];
NSString *uniqueIdentifier = [device uniqueIdentifier];

NSLog(uniqueIdentifier);
NSLog([self URLEncodeString:uniqueIdentifier]);

這是當我按下此代碼時生成的日志:

2010-06-23 21:58:51.671 provaNavigation[2343:20b] 00000000-0000-1000-8000-0013775CE6D2
2010-06-23 21:58:51.672 provaNavigation[2343:20b] 0000000010003900009080176010001273086780001283520013775CE6D2

然后再次:

2010-06-23 21:59:25.614 provaNavigation[2343:20b] 00000000-0000-1000-8000-0013775CE6D2
2010-06-23 21:59:25.615 provaNavigation[2343:20b] 000000001000390000908192801000-18000912258750013775CE6D2

然后再次:

2010-06-23 21:59:40.848 provaNavigation[2343:20b] 00000000-0000-1000-8000-0013775CE6D2
2010-06-23 21:59:40.849 provaNavigation[2343:20b] 000000001000390000908866081000-18000912239630013775CE6D2

然后再次...

我每次都會得到一個不同的值,並且永遠無法使用正確的%number進行校正。

我之前遇到過URL編碼問題,所以最終在NSString上編寫了一個類別以正確編碼URL:

- (NSString *) URLEncodedString {
  NSMutableString * output = [NSMutableString string];
  const char * source = [self UTF8String];
  int sourceLen = strlen(source);
  for (int i = 0; i < sourceLen; ++i) {
    const unsigned char thisChar = (const unsigned char)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;
}

- (NSString *) URLDecodedString {
  NSString * spacedDecoded = [self stringByReplacingOccurrencesOfString:@"+" withString:@" "];
  return [spacedDecoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}

關於此有一些注意事項:

  1. 這會將空格編碼為“ +”
  2. 這將對除az(大寫和小寫),數字,句點,連字符,下划線和代字號之外的所有內容進行編碼
  3. 這樣可以將Unicode字符正確編碼為多個八位字節。 例如,我可以這樣做:

      NSString * enc = [@“http://example.com/?data=÷¡¿” URLEncodedString];\n NSLog(@“%@”,enc);\n NSLog(@“%@”,[enc URLDecodedString]); 

    哪個將正確記錄:

      Testing.m:65 main()http%3A%2F%2Fexample.com%2F%3Fdata%3D%C3%B7%C2%A1%C2%BF\n Testing.m:66 main()http://example.com/?data=÷¡¿ 

編輯我將其復制並粘貼到一個空項目中,如下所示:

NSString * string = @"00000000-0000-1000-8000-0013775CE6D2";
NSString *result = (NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR("'\"?=&+<>;:-"), kCFStringEncodingUTF8);
NSLog(@"encode? %@", result);
result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"decode? %@", result);
NSLog(@"equal? %d", [string isEqual:result]);

它記錄:

Testing[62541:a0f] encode? 00000000%2D0000%2D1000%2D8000%2D0013775CE6D2
Testing[62541:a0f] decode? 00000000-0000-1000-8000-0013775CE6D2
Testing[62541:a0f] equal? 1

您的代碼無法正常工作的原因是,您將字符串記錄為格式字符串 ,這意味着它看到%2東西並試圖用其他東西替換它。 觀察:

NSString * string = @"00000000-0000-1000-8000-0013775CE6D2";
NSString *result = (NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR("'\"?=&+<>;:-"), kCFStringEncodingUTF8);
NSLog(@"%@", result);
NSLog(result);

日志:

Testing[62585:a0f] 00000000%2D0000%2D1000%2D8000%2D0013775CE6D2
Testing[62585:a0f] 00000000879923200001897296640100041968968000 00013775CE6D2

因此,該字符串已得到正確的編碼,但是您只是在錯誤地記錄它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM