Iphone URL的编码字符串

Iphone URL的编码字符串,iphone,objective-c,post,nsstring,urlencode,Iphone,Objective C,Post,Nsstring,Urlencode,我必须将数据从Iphone应用程序发布到php页面,因此我需要正确编码参数,转换特殊字符 具体来说,我需要发送iphone的UDID 我在web上找到了许多帮助,可以将字符串编码为作为参数传递,但我遇到了一个奇怪的错误 我正在使用这个函数: - (NSString *)URLEncodeString:(NSString *)string { NSString *result = (NSString*)CFURLCreateStringByAddingPercentEscapes(kCF

我必须将数据从Iphone应用程序发布到php页面,因此我需要正确编码参数,转换特殊字符

具体来说,我需要发送iphone的UDID

我在web上找到了许多帮助,可以将字符串编码为作为参数传递,但我遇到了一个奇怪的错误

我正在使用这个函数:

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

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

return [result autorelease];}
这是我点击以下代码时生成的日志:

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
再说一遍:

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];
}
代码无法工作的原因是,您正在将字符串记录为格式字符串,这意味着它正在查看
%2
内容,并试图用其他内容替换它。注意:

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

因此字符串被正确编码,但您只是错误地记录了它。

我以前遇到过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];
}
代码无法工作的原因是,您正在将字符串记录为格式字符串,这意味着它正在查看
%2
内容,并试图用其他内容替换它。注意:

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

因此字符串编码正确,但您只是记录错误。

这是在设备中还是在模拟器中?这是在设备中还是在模拟器中?谢谢您的回答。但我想知道为什么我使用的代码工作不正常。。。在网络上,许多人声称该代码有效!该死,我就知道这是件蠢事。非常感谢你,伙计!谢谢你的回答。但我想知道为什么我使用的代码工作不正常。。。在网络上,许多人声称该代码有效!该死,我就知道这是件蠢事。非常感谢你,伙计!
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